max()大嵌套列表

时间:2016-10-05 11:46:08

标签: python list max nested-lists

我在处理一对长列表对的最大值时遇到了一个非常奇怪的问题,例如

[
    [(0, 1), (1, 1), (2, 1), (3, 4), (4, 1), (5, 1), (6, 1),...,(141,3)],
    ..., 
    [(12, 1), (36, 1), (91, 1), (92, 1), (110, 1),..., (180, 1)]
]

我试图获得所有对中第一个元素的最大值。 从语法上说,我在做:

max([max(x) for x in list])[0]

实际上返回正确的数字,如果列表短于281个列表。 事实上,一旦列表超过280,我就会收到此消息

ValueError: max() arg is an empty sequence

所以,长篇清单

max([max(x) for x in list[0:280]])[0]

没关系,而

max([max(x) for x in list[0:281]])[0]

符。

我在这里做错了吗?

2 个答案:

答案 0 :(得分:5)

您的列表列表中有一个空列表,位于索引280.最多切换为[:280]会将其排除,并且[:281]中包含该列表。

使用较短的样本可以轻松复制:

>>> lsts = [
...     [(0, 1), (1, 1)],
...     [(2, 1), (3, 4)],
...     [(4, 1), (5, 1)],
...     [],  # empty at index 3
... ]
>>> max(max(x) for x in lsts)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 1, in <genexpr>
ValueError: max() arg is an empty sequence
>>> max(max(x) for x in lsts[:3])  # include everything before index 3
(5, 1)

您可以使用chain.from_iterable()将列表链接在一起,完全避免此问题:

from itertools import chain

max(chain.from_iterable(list_of_lists))[0]

这会将所有嵌套列表视为一个长列表,其间的空列表根本不会对该新序列有所贡献。

答案 1 :(得分:0)

为什么不呢?

max([max([t[0] for t in sl if t]) for sl in l if sl])

您可以从头开始提取第一个项目。空列表和元组将被忽略。

修改

max([max([t for t in sl if t]) for sl in l if sl])[0]

效率更高。