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

新手上路,请多包涵

目前正在运行:

 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)

原文由 deepbrook 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 517
2 个回答

我会用生成器表达式和 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 一旦生成器产生长度不同的第一个列表。

原文由 timgeb 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

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

或者作为一种更有效的方式,您可以在 anyall 中使用生成器表达式。

 def check_size_eq(lst):
    # returns true if there's any list with unequal length to the first one
    return not any(len(lst[0])!= len(i) for i in lst)
    # or you could do:
    # return all(len(lst[0])== len(i) for i in lst)

演示:

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

原文由 Mazdak 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题