我有一长串字符串,格式如下:
[...
(0.5, 'house', 'flower'),
(0.213, 'garden', 'flowerpot'),
(None, 'mulch', 'hunting'),
(0.9, 'flower', 'tulip'),
(0.34, 'party', 'music'),
(None, 'piano', 'trowel'),
(0.138, 'fertilizer', 'cow')
...]
在我根据第一个元素对列表进行排序之前,我必须将None类型转换为浮点数。如何将列表中的所有Nones更改为浮动0?
我在尝试:
mylist = map(lambda x: 0 if x[0] == None, else x, mylist)
但在某些地方我的语法出错了 - 任何人都有建议将Pythonic替换为整个列表中每个字符串的第一个元素中的Nones吗?
答案 0 :(得分:2)
您可以使用:
list(map(lambda x: (0.0,)+x[1:] if x[0] is None else x,mylist))
产生:
>>> list(map(lambda x: (0.0,)+x[1:] if x[0] is None else x,mylist))
[(0.5, 'house', 'flower'), (0.213, 'garden', 'flowerpot'), (0.0, 'mulch', 'hunting'), (0.9, 'flower', 'tulip'), (0.34, 'party', 'music'), (0.0, 'piano', 'trowel'), (0.138, 'fertilizer', 'cow')]
代码的工作原理如下:我们因此使用lambda x: (0.0,)+x[1:] if x[0] is None else x
作为映射函数执行映射。
这是三元运算符:如果是第一个元素x[0] is None
,我们返回(0.0,)+x[1:]
,因此我们构造一个以0.0
为第一个元素的新元组,并且x[1:]
作为剩余元素。如果第一个元素不是None
,我们只返回x
。
这将适用于每个元组,因为它具有至少一个元素。如果列表中可以有空元组,我们可以将表达式改为:
list(map(lambda x: (0.0,)+x[1:] if x and x[0] is None else x,mylist))
答案 1 :(得分:0)
您可以使用列表理解:
l = [(0.5, 'house', 'flower'),
(0.213, 'garden', 'flowerpot'),
(None, 'mulch', 'hunting'),
(0.9, 'flower', 'tulip'),
(0.34, 'party', 'music'),
(None, 'piano', 'trowel'),
(0.138, 'fertilizer', 'cow'),
]
l = [ (0.0,)+ x[1:] if x[0] is None else x for x in l]
输出:
[(0.5, 'house', 'flower'), (0.213, 'garden', 'flowerpot'), (0.0, 'mulch', 'hunting'), (0.9, 'flower', 'tulip'), (0.34, 'party', 'music'), (0.0, 'piano', 'trowel'), (0.138, 'fertilizer', 'cow')]