识别列表长度相似性的最佳方法

scr*_*esh 5 python algorithm list

我有一个包含其键下的列表的dict:

dct = {'a': [1, 2, 3],
       'b': [1, 2, 3, 4],
       'c': [1, 2]}
Run Code Online (Sandbox Code Playgroud)

识别列表长度是否相同的最佳方法是什么?

这是我的解决方案:

import itertools
len(set(itertools.imap(len, dct.viewvalues()))) == 1
Run Code Online (Sandbox Code Playgroud)

True如果相似,False如果不相似

UPD:参考@RaymondHettinger建议替换mapitertools.imap

Ray*_*ger 6

你的解决方案很好.

如果你想稍微调整一下,可以使用itertools.imap()而不是map().这会将内存占用减少到O(1)而不是O(n).


ovg*_*vin 5

首先,我会坚持使用itervalues,它使用简单的评估。

其次,我会对依赖 using 持谨慎态度,set因为它在遍历字典的每次迭代中都会查找集合中的值。根据文档,这是O(1)超额的(O(n)最糟糕的情况是O(1)在我们的情况下,如果所有长度都相同,并且如果所有长度都不同) 。但很难评估使用 set 的开销。O(n)

all我会在这种情况下使用。all当找到第一个False值时失败。因此,长度的第一次不匹配将停止交互过程。而如果使用set,它会遍历所有列表直到最后,然后才将其长度与 进行比较1

>>> dct = {'a': [1, 2, 3],
       'b': [1, 2, 3, 4],
       'c': [1, 2]}
>>> lenght_1 = len(dct.itervalues().next())
>>> all(len(value)==lenght_1 for value in dct.itervalues())
False

>>> dct = {'a': [1, 2, 3],
       'b': [1, 2, 4],
       'c': [1, 2, 5]}
>>> lenght_1 = len(dct.itervalues().next())
>>> all(len(value)==lenght_1 for value in dct.itervalues())
True
Run Code Online (Sandbox Code Playgroud)

可以通过使用相同的迭代器来优化代码,it该迭代器不会两次遍历第一个值:

>>> it = dct.itervalues()
>>> length_1 = len(next(it))
>>> all(len(value)==l1 for value in it)
True
Run Code Online (Sandbox Code Playgroud)