2024-09-27 00:18:51 发布
网友
我有一个dict在其键下包含列表:
dct = {'a': [1, 2, 3], 'b': [1, 2, 3, 4], 'c': [1, 2]}
识别列表长度是否相同的最佳方法是什么?在
这是我的解决方案:
True如果相似,False如果不是
True
False
UPD:在引用@RaymondHettinger建议时,将map替换为{}
map
你的解决方案看起来不错。在
如果你想用一点,用itertools.imap()而不是map()。这将把内存占用压缩为O(1)而不是O(n)。在
注意:ovgolovin's solution要好得多。我把这个答案留在这里是因为有人在讨论这个问题。
您的解决方案很好,但您可以使用一个使用较少内存且更具可读性的生成器表达式:
len(set(len(x) for x in dct.viewvalues()))) == 1
首先,我将坚持使用itervalues,它使用简单的求值。在
itervalues
{I依赖于在第二次迭代中使用cdy}来执行。根据docs,它是O(1)(在更坏的情况下,O(n)在我们的例子中是{},如果所有长度都不同,O(n))。但是很难评估使用set的开销。在
O(1)
O(n)
在本例中,我将使用all。all在找到第一个False值时失败。所以,长度的第一个不匹配会停止交互过程。但是,如果使用set,它会将所有列表遍历到最后,然后才将其长度与1进行比较。在
all
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
可以通过使用相同的迭代器it优化代码,该迭代器不会遍历第一个值两次:
it
你的解决方案看起来不错。在
如果你想用一点,用itertools.imap()而不是map()。这将把内存占用压缩为O(1)而不是O(n)。在
注意:ovgolovin's solution要好得多。我把这个答案留在这里是因为有人在讨论这个问题。
您的解决方案很好,但您可以使用一个使用较少内存且更具可读性的生成器表达式:
首先,我将坚持使用
itervalues
,它使用简单的求值。在{I依赖于在第二次迭代中使用cdy}来执行。根据docs,它是},如果所有长度都不同,
O(1)
(在更坏的情况下,O(n)
在我们的例子中是{O(n)
)。但是很难评估使用set的开销。在在本例中,我将使用
all
。all
在找到第一个False
值时失败。所以,长度的第一个不匹配会停止交互过程。但是,如果使用set
,它会将所有列表遍历到最后,然后才将其长度与1
进行比较。在可以通过使用相同的迭代器
^{pr2}$it
优化代码,该迭代器不会遍历第一个值两次:相关问题 更多 >
编程相关推荐