我想计算两个列表(list1
和list2
)在同一索引中具有相同数字的次数。
首先,有这种方法:
def count_common(list1, list2):
count = 0
for i, elem1 in enumerate(list1):
if elem1 == list2[i]:
count += 1
return count
这是O(n)时间和O(1)空间。
如果我尝试更多的Pythonic方式,我会获得O(n)空间:
def count_common(list1, list2):
return sum([1 for (elem1, elem2) in zip(list1, list2) if elem1 == elem2])
是否有一种Pythonic方法可以维持我初始解决方案中使用的O(1)空间?
谢谢!
答案 0 :(得分:3)
首先,你应该真正理解使用单行是不是Pythonic 的同义词。话虽这么说,您可以使用生成器表达式而不是列表推导来使用常量空间:
sum(a == b for a, b in zip(list1, list2))
我实际上会使用上面的单行。它非常易读。但是,循环的等价物就像:
一样好total = 0
for a, b in zip(list1, list2):
total += a == b
事实上,如果for循环方法更具性能,我不会感到惊讶。你因发电机开销而损失惨重。