您需要测试isbn 中的所有 值,然后才能得出任何匹配结果。
不是先循环isbn,而是循环sku并使用每个isbn值测试该值; any() function 让这一切变得更简单、更高效:
for value in sku:
if not any(i in value for i in isbn):
print(value)
更有效的方法仍然是拆分 ISBN 部分,并针对一组进行测试:
isbn_set = set(isbn)
for value in sku:
isbn_part = value.partition(' ')[-1] # everything after the first space
if isbn_part not in isbn_set:
print(value)
这完全避免了循环isbn;设置成员资格测试需要 O(1) 恒定时间;对于 N skus 和 M ISBN 值,这会产生一个 O(N) 循环(与 any() 的 O(NM) 循环相比)。
任一版本都可以转换为list comprehension 以生成匹配列表;首选设置版本则变为:
isbn_set = set(isbn)
not_matched = [value for value in sku if value.partition(' ')[-1] not in isbn_set]
后者的演示:
>>> isbn = ["1111","2222","3333","4444","5555"]
>>> sku = ["k1 1111", "k2 2222", "k3 3333", "k4 4444", "k5 5555", "k6 6666", "k7 7777", "k8 8888" ,"k9 1111"]
>>> isbn_set = set(isbn)
>>> [value for value in sku if value.partition(' ')[-1] not in isbn_set]
['k6 6666', 'k7 7777', 'k8 8888']