暂时不进入应用程序,以保持简短。这是我的数据:(数字和字符串列表(
mylist=[20201209, 7100.0, 'paypal', 400.0, 'out', 'monthly', 'Paypal', 100.61676684696863, '']
我需要将其转换为一个由制表符分隔的字符串,在这里我定义了制表符的大小,因为我正在尝试打印列(使用textwrap模块中的wrap函数。但我的问题还在这个阶段之前(。
此子表达式工作正常:lambda x: (x,str(round(x,2))) [type(x)!=str]
但当我把它放进(列出的(映射函数中时,如下所示:list(map(lambda x: (x,str(round(x,2))) [type(x)!=str],mylist)
我得到这个:
TypeError:类型str没有定义轮方法
,就好像它试图解析str(作为str.
我使用lambda格式是因为它最容易阅读。使用更传统的格式,例如list(map(lambda x: str(round(x,2)) if type(x)!=str else x,mylist))
运行良好。但是lambda是为了简洁,如果可以的话,我想避免使用if
和else
关键字。也许这种格式在3.7.7中已经过时了?官方文件对此相当神秘。
至于应用程序,我将使用的最后一个表达式是:c='t'.join(list(map(lambda x: (x,str(round(x,2))) [type(x)==str],mylist)))
wrapper.tabsize=2
print(wrapper.wrap(c)[0])
这来自一个将构成列的列表列表。我还是Python的新手,所以如果有更干净的方法可以做到这一点,请随时告诉我!(尽管以艰难的方式做这件事是一种很好的做法。在一些库中可能会有一行代码。(
这行得通吗?
>>> list(map(lambda x: {str: lambda y: y}.get(type(x), lambda y: str(round(y, 2)))(x), mylist))
['20201209', '7100.0', 'paypal', '400.0', 'out', 'monthly', 'Paypal', '100.62', '']
# Hint: This solves your problem, but dont do this! Read on..
重点是,一句话肯定很棒。当然map
看起来很紧凑(至少这里没有(。但更喜欢做可读、可维护且本质上简单的事情。
我仍然建议你坚持你的另一个版本(稍微修改一下,让它更像蟒蛇(:
result = [str(round(x, 2)) if isinstance(x, str) else x for x in mylist]
#yours = list(map(lambda x: str(round(x,2)) if type(x) != str else x, mylist))
# ^ indented so you can compare which one is compact.
请将它与这个答案中第一行的怪物进行比较。
最后:(something(x)) [type(x)!=str]
不会做你认为它会做的事。它将完全评估something(x)
(这正是您面临错误的原因(,使用返回值(result
(,然后尝试类似于:result.__getitem__(boolean_value)
。