如何在Python中对两个列表进行异或?

edd*_*ken 9 python python-3.x

我有两个列表,例如:

a = ['hello','world']
b = ['hello','world','im','steve']
Run Code Online (Sandbox Code Playgroud)

如果我想创建一个仅包含两个元素的第三个列表:

c = ['im','steve']
Run Code Online (Sandbox Code Playgroud)

如果元素的顺序很重要,我该怎么做?我知道我可以使用套装,但他们不断抛弃我的清单.我可以使用' '.join(list)它们将它们转换为字符串,但不知道如何以该格式执行此操作.

Aja*_*234 13

您可以连接列表并使用列表理解:

a = ['hello','world']
b = ['hello','world','im','steve']
final_vals = [i for i in a+b if i not in a or i not in b]
Run Code Online (Sandbox Code Playgroud)

输出:

['im', 'steve']
Run Code Online (Sandbox Code Playgroud)


pyl*_*ang 9

选项1:设定方法(推荐)

集合有一个symmetric_difference方法,专门从其中a或返回元素b.可以使用列表理解来保留顺序以用于连接列表a + b.

comp = set(a).symmetric_difference(b)
[x for x in a + b if x in comp]
# ['im', 'steve']
Run Code Online (Sandbox Code Playgroud)

选项2:pathlib方法

作为参考,另一种区分两个列表的pathlib.Path.relative_to方法可能是使用方法:

import pathlib


p = pathlib.Path(*b)
r = p.relative_to(*a)
list(r.parts)
# ['im', 'steve']
Run Code Online (Sandbox Code Playgroud)

注意:b是较长的列表.此选项的效率可能低于简单列表推导.


Tai*_*Tai 5

将两个列表相加并减去交集部分(如果它显示在新列表中)。顺序被保留。

c = a + b
for v in set(a).intersection(set(b)):
    while v in c:
        c.remove(v)
Run Code Online (Sandbox Code Playgroud)

  • 不要太担心downvotes。如果您有新的好答案,您可以随时删除错误的答案。(甚至还有一个 [badge](https://stackoverflow.com/help/badges/38/peer-pressure))另一方面,如果答案不正确,最好通过投票将其标记为正确. (2认同)