筛选字符串列表,使其不包含作为子字符串的其他列表中的任何字符串

2024-06-01 07:08:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我有下面的代码来选择其他列表中不包含的值。你知道吗

import re
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"]

for x in isbn:
    for i in sku:
        if x not in i:
            print (i)

预期结果如下:

k6 6666
k7 7777
k8 8888

但我得到了所有无与伦比的价值观。我如何才能得到预期的结果,如我上面所示。你知道吗


Tags: 代码inimportre列表fork2k1
3条回答

您需要测试isbn中的所有值,然后才能得出这些值都不匹配的结论。你知道吗

与其先在isbn上循环,不如在sku上循环,然后用每个isbn值测试该值;^{} 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)

这避免了在isbnaltogther上循环;设置成员资格测试需要O(1)个常量时间;对于N个sku和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']

您应该在循环中使用^{}。事实上,您可以使用以下列表理解实现:

>>> list_1  = ["1111","2222","3333","4444","5555"]
>>> list_2 = ["k1 1111", "k2 2222", "k3 3333", "k4 4444", "k5 5555", "k6 6666", "k7 7777", "k8 8888" ,"k9 1111"]

>>> [x for x in list_2 if not any( y in x for y in list_1)]
['k6 6666', 'k7 7777', 'k8 8888']

这里any将返回True,如果list_1中的任何字符串作为list2中的子字符串出现。一旦找到匹配项,它将短路迭代(不检查其他匹配项),并将结果返回为True。你知道吗

如果您对使用any不感兴趣,您可以使用下面的for循环得到相同的结果:

for x in list_2:
    for y in list_1:
        if y in x:
            break
    else:
        print(x)

它将打印您想要的输出:

k6 6666
k7 7777
k8 8888

如果从集合中删除匹配项,则剩余的集合就是您要查找的:

代码:

skus = set(sku)
for x in isbn:
    skus -= {i for i in skus if x in i}

测试代码:

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"]

skus = set(sku)
for x in isbn:
    skus -= {i for i in skus if x in i}
print(skus)

结果:

{'k6 6666', 'k7 7777', 'k8 8888'}

相关问题 更多 >