[英]Python: fastest way to check whether two string lists are “similar”
我有两个固定大小的字符串列表,我想检查两个列表是否“相似”,如以下示例所示:
list1 = ["a", None, "c", None, "e", None]
list2 = ["a", "b", "c", "d", "e", "f"]
similar = True
for i in xrange(6):
if list1[i] is not None:
if list1[i] != list2[i]:
similar = False
break
有没有更快的方法可以做到这一点?
更新:我刚刚使用zip
测试了一些解决方案。 因为zip
将考虑两个列表中的所有元素,所以它们的速度并不快。 请注意,在很多情况下,两个列表中的第一个元素是不同的,因此我提供的程序会立即停止检查其余元素,从而提供了更快的解决方案。
如果您担心提早退房,可以这样做:
iter1, iter2 = iter(list1), iter(list2)
similar = True
while True: # or `while similar`
try:
a, b = next(iter1), next(iter2)
except StopIteration:
break
if a is not None and b is not None and a != b:
similar = False
break
# similar is your result
等同于:
import itertools
all(a==b for a,b in itertools.izip(list1, list2) if a is not None and b is not None)
等同于:
import itertools
for a,b in itertools.izip(list1, list2):
if a is None or b is None:
continue
if a != b:
break
else:
# similar
有没有更快的方法可以做到这一点?
是的,摆脱if
嵌套会有所不同:
list1 = ["a", None, "c", None, "e", None]
list2 = ["a", "b", "c", "d", "e", "f"]
similar = True
for i in xrange(6):
if list1[i] is not None and list1[i] != list2[i]:
similar = False
break
print(similar)
# True
我认为这个算法是错误的。 如果list1
和list2
互换:
list1, list2 = list2, list1
similar = True
for i in xrange(6):
if list1[i] is not None and list1[i] != list2[i]:
similar = False
break
print(similar)
# False
但是它们是两个相同的列表,仍应视为相似。 IMO此代码(在两个列表中均检查“ None
是正确的:
similar = True
for i in xrange(6):
if ((list1[i] is not None and list2[i] is not None) and
list1[i] != list2[i]):
similar = False
break
print(similar)
# True
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.