我有一个可变数量的列表,我想从所有列表中找到每个这些数字的最大值。
我正在尝试使用map函数来映射所有列表的最大值,我需要使用生成器表达式来传递map函数中的参数。
我正在使用这样的东西,但它不起作用:
map(max,x[c] for c in x.keys())
作为一个例子,我的列表在字典中:
{1: [0, 1, 0, 0, 3, 0],
2: [1, 0, 0, 0, 0, 4, 5],
3: [0, 5, 6, 0, 1, 1]}
您可能已经注意到列表的大小并不相同,这就是我想要它们的方式,因为我拥有需要解析的数据的方式。
结果应该是:[1, 5, 6, 0, 3, 4, 5]
如果还有其他方法,请建议。
以上是该列表的示例。由于我的实际字典设置方式,我无法使用x.values()来检索列表。列表嵌入在层次结构的底部,我需要遍历层次结构的顶部以检索要比较的列表。我必须使用生成器表达式来检索所有列表,因此请在不使用x.values()
的情况下提供解决方案答案 0 :(得分:4)
要使max
超过最短值的结尾,您需要izip_longest
:
from itertools import izip_longest
d={1: [0, 1, 0, 0, 3, 0],
2: [1, 0, 0, 0, 0, 4, 5],
3: [0, 5, 6, 0, 1, 1]}
# there are other variations like
# [max(column) for column in izip_longest(*d.itervalues())]
print map(max, izip_longest(*d.values()))
# [1, 5, 6, 0, 3, 4, 5]
在Python 3上称为zip_longest
。
即使您没有简单的方法来访问所有列表,这仍然是这样做的方法。您可以随意获取列表:
d = {1: {'a': [0, 1, 0, 0, 3, 0]},
2: {'a': [1, 0, 0, 0, 0, 4, 5]},
3: {'a': [0, 5, 6, 0, 1, 1]}}
def value_gen(obj):
for key in obj:
yield obj[key]['a']
然后使用:
map(max, izip_longest(*value_gen(d)))