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建议替换map为itertools.imap
首先,我会坚持使用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)