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

2024-09-27 00:18:51 发布

您现在位置:Python中文网/ 问答频道 /正文

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

dct = {'a': [1, 2, 3],
       'b': [1, 2, 3, 4],
       'c': [1, 2]}

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

这是我的解决方案:

^{pr2}$

True如果相似,False如果不是

UPD:在引用@RaymondHettinger建议时,将map替换为{}


Tags: 方法falsetruemap列表解决方案建议dict
3条回答

你的解决方案看起来不错。在

如果你想用一点,用itertools.imap()而不是map()。这将把内存占用压缩为O(1)而不是O(n)。在

注意:ovgolovin's solution要好得多。我把这个答案留在这里是因为有人在讨论这个问题。

您的解决方案很好,但您可以使用一个使用较少内存且更具可读性的生成器表达式:

len(set(len(x) for x in dct.viewvalues()))) == 1

首先,我将坚持使用itervalues,它使用简单的求值。在

{I依赖于在第二次迭代中使用cdy}来执行。根据docs,它是O(1)(在更坏的情况下,O(n)在我们的例子中是{},如果所有长度都不同,O(n))。但是很难评估使用set的开销。在

在本例中,我将使用allall在找到第一个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

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

^{pr2}$

相关问题 更多 >

    热门问题