1

我有两个列表,我想选择lst1不包含元素的所有元素lst2,奇怪的是如果我这样做:

lst1 = ['a','k','lb','o','oc']
lst2 = ['a','b','c']
for i in lst1:
    for o in lst2:
        if i.__contains__(o) == True:
            print(i)

我得到:

a
lb
oc

这是有道理的,但是当我替换TrueFalse,而不是得到相反的结果时,我得到了这个

lst1 = ['a','k','lb','o','oc']
lst2 = ['a','b','c']
for i in lst1:
    for o in lst2:
        if i.__contains__(o) == False:
            print(i)

我明白了

a
a
k
k
k
lb
lb
o
o
o
oc
oc

所以我有两个问题:

1-发生了什么导致输出像这样?

2-我怎样才能得到lst1不包含任何元素的元素lst2?(输出应该是:'k''o'

4

3 回答 3

1

Python 集是解决这个问题的好方法。这是假设您想在每个字符的基础上执行此操作。

lst1 = ['a','k','lb','o','oc']
lst2 = ['a','b','c']
[v for v in lst1 if not set(v) & set(lst2)]

上面的最后一行使用了几种技术。

列表理解:该语法[expression for variable in iterator if condition]用于基于另一个迭代器或列表生成新列表。如果您包含一个条件,它也可以被过滤。

set数据类型set()调用从任何可迭代对象构造一个新集合。在 python 中,字符串是可迭代的,因此它将形成该字符串中每个字符的集合。列表是可迭代的,因此它将从lst2

集合交集运算符:&运算符将相交两个集合并返回一组新的仅包含共同项的集合。

空集的计算结果为假:仅当该集为空时, sayingnot some_set才会返回 True。

输出是:

['k', 'o']
于 2020-12-25T00:04:49.823 回答
1

我看到有关列表理解的答案,但看起来您的情况是您不希望字符串的任何部分匹配?如我错了请纠正我。

无论如何,在那种情况下,你会做

for i in lst1:
     found = False
     for j in lst2:
             if j in i:
                     found = True   # using bool instead of printing right away prevents dupes, since you're traversing the list over and over
     if not found:
             print(i)

这输出:

k
o

否则你只会使用字符串理解

diff = [i for i in lst1 if i not in lst2]
print(diff)
于 2020-12-25T00:12:27.290 回答
0
  1. 在您的原始代码中,当您将条件更改为 false 时,在循环的第一次迭代中,从 lst1 中选择第一个字符,即“a”。由于 'a' 不匹配 'b' 和 lst2 中的 'c' 'a' 被打印两次。同样,剩余的迭代也会发生。我会建议使用调试器并通过每个循环来了解值是如何变化的,这可能会帮助您更好地理解。

  2. 这个问题可以在下面的代码的帮助下解决,首先你找到所有匹配的元素,然后从原始列表中减去它

lst1 = ['a', 'k', 'lb', 'o', 'oc']
lst2 = ['a', 'b', 'c']
tmplist = []

#find the list of elements that exists in lst2 from lst1
for i in lst1:
    for o in lst2:
        if o in i:
            tmplist.append(i)

#removing removing tmplist elemnts from lst1
l2 = list(list(set(lst1) - set(tmplist)) + list(set(tmplist) - set(lst1)))
print(l2)

Output:
['o', 'k']
于 2020-12-25T00:31:00.960 回答