我有一个列表,例如E [] [],其中E有十个子列表,每个子列表大约有500个。
我最关心的是计算所有5000个值的最大值,这些值分布在十个子列表中。
现在,我写的是:
MinVal = min(min(E[i]) for i in range(len(E)))
它给了我这个错误: ValueError:min()arg是一个空序列
现在我写了这个:
min_arr = []
for i in range(len(E)):
min_arr.append(min(E[i]))
MinVal = min(min_arr)
它给了我同样的错误: ValueError:min()arg是一个空序列
所以,我只是试着这样做:
print(max(E[1]))
它会给我答案
前两个代码适用于小型5-10元素列表。但是显示了大数据集的问题。
我该怎么办?
答案 0 :(得分:4)
您的代码:
MinVal = min(min(E[i]) for i in range(len(E)))
在E[i] == []
时失败,因为没有明确定义空集的最小值。因此,您需要跳过空子列表。一种选择是:
min_val = min(min(e) for e in E if e)
大致相当于:
min_vals = []
for e in E:
if e: # or 'if e != []:' - empty sequences evaluate False-y
mins.append(min(e))
min_val = min(min_vals)
(请注意,您实际上并未在任何地方使用索引i
,因此您可以直接在E
上进行迭代。)
5,000项不是那么多,你可能不需要过多担心效率。
答案 1 :(得分:1)
您希望使用生成器表达式通过嵌套循环来展平列表:
MinVal = min(i for sublist in E for i in sublist)
您的错误表明至少有一个子列表为空,但上述情况自然会跳过这些空的子列表。
如果您需要确定最小值和最大值,请不要使用两个循环。使用一个循环并“手动”跟踪最小值和最大值:
minimum = float('inf')
maximum = float('-inf')
for sublist in E:
for i in sublist:
if i < minimum:
minimum = i
if i > maximum
maximum = i
这可确保您只对大量值进行一次循环。