簡體   English   中英

Python:檢查兩個字符串列表是否“相似”的最快方法

[英]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

我認為這個算法是錯誤的。 如果list1list2互換:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM