目前正在运行:
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)
?
答案 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]