更好的方法来检查列表中的所有列表是否都是相同的长度?

时间:2016-03-04 08:13:13

标签: python algorithm python-3.x

目前正在运行:

l1 = [i for i in range(0,10)]
l2 = [i for i in range(0,10)]
l3 = [i for i in range(0,10)]
lists = [l1, l2, l3]
length = len(lists[0])
for l in lists:
    if length != len(l):
        raise ValueErrorr('not all lists have same length!')

有没有比for循环测试更漂亮的方法?有没有更快/更好的方式,而不是O(n)

5 个答案:

答案 0 :(得分:6)

我使用生成器表达式和all

来完成
>>> it = iter(lists)
>>> the_len = len(next(it))
>>> if not all(len(l) == the_len for l in it):
...     raise ValueError('not all lists have same length!')

这样可以避免两次检查第一个列表的长度,并且不会构建一次性列表/设置数据结构。

all也会延迟评估,这意味着只要生成器生成第一个长度不同的列表,它就会停止并返回False

答案 1 :(得分:4)

首先,您的解决方案不是O(logn)。并且不存在对数算法。您必须至少检查一次每个项目,因此O(n)是最佳复杂度。

#  import imap from itertools on Py2


if len(set(map(len, lists))) not in (0, 1):
    raise ValueErrorr('not all lists have same length!')

答案 2 :(得分:2)

您可以使用集合理解来保留唯一的长度,然后检查您是否只有一个项目集合:

if len({len(i) for i in lists}) == 1:
    # do stuff

如果你不想在你的套装上调用len(),另一个棘手的方法是你可以使用以下逻辑:

unique_len = {len(i) for i in lists}
if unique_len.pop() and not unique_len:
    # do stuff

演示:

>>> a = {1}
>>> 
>>> a.pop() and not a
True
>>> a = {1,3}
>>> a.pop() and not a
False

答案 3 :(得分:1)

你可以使用map函数来获取列表的长度(在python3中,这将是一个迭代器)

lengths = map(len,lists)

然后,您可以将set函数应用于此函数,将其转换为一组唯一值。如果只有一个值,那么它们的长度相同。

if len(set(map(len,lists)))==1:
    print("All are the same length")
else:
    print("They are not the same length!")

答案 4 :(得分:0)

在旁观者眼中定义'更漂亮的方式',这个很光滑但不清楚,因为python代码应该是理解的。

lists_are_length_equaled = False not in [len(i) == len(lists[0]) for i in lists]