映射到最大可变数量的列表

时间:2012-04-16 20:10:38

标签: python

我有一个可变数量的列表,我想从所有列表中找到每个这些数字的最大值。

我正在尝试使用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()

的情况下提供解决方案

1 个答案:

答案 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)))