0

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

我正在尝试使用 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() 的解决方案

4

1 回答 1

4

要使maxs 超过最短值的末尾,您需要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]

zip_longest它在 Python 3上被称为。


即使您没有访问所有列表的简单方法,这仍然是一种方法。您可以根据需要获取列表:

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)))
于 2012-04-16T20:18:23.420 回答