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

2024-05-16 05:15:31 发布

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

当前正在运行:

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)?在


Tags: inl1forlenifhavenotrange
3条回答

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

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

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

^{pr2}$

演示:

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

首先,您的解决方案不是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!')

我将使用生成器表达式和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!')

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

all也延迟求值,这意味着一旦生成器生成第一个长度不同的列表,它将停止并返回False。在

相关问题 更多 >