保留两个列表之间差异的顺序

问题描述 投票:0回答:5

我有两个列表

l
l_match
l_match
是一个空列表。

l = ['gtttaattgagttgtcatatgttaataacg',
     'tttaattgagttgtcatatgttaataacgg',
     'ttaattgagttgtcatatgttaataacggt',
     'taattgagttgtcatatgttaataacggta',
     'aattgagttgtcatatgttaataacggtat']

l_match = []

print list(set(l) - set(l_match))

给出输出

['aattgagttgtcatatgttaataacggtat',
 'tttaattgagttgtcatatgttaataacgg',
 'ttaattgagttgtcatatgttaataacggt',
 'taattgagttgtcatatgttaataacggta',
 'gtttaattgagttgtcatatgttaataacg']

我希望输出与输入的顺序相同。即在上述情况下的输出 应该是

['gtttaattgagttgtcatatgttaataacg',
 'tttaattgagttgtcatatgttaataacgg',
 'ttaattgagttgtcatatgttaataacggt',
 'taattgagttgtcatatgttaataacggta',
 'aattgagttgtcatatgttaataacggtat']

您可以提出修改建议吗?

python list set set-difference
5个回答
2
投票

只需制作

l_match
一套即可:

l_match = []

st =  set(l_match)

print([ele for ele in l if ele not in st])

如果

l
可能有欺骗行为,请使用 OrderedDict 从
l
获取唯一值:

from collections import OrderedDict
print([ele for ele in OrderedDict.fromkeys(l) if ele not in st])

显然

l_match
将包含现实世界中的值,或者一个简单的
l[:] = OrderedDict.fromkeys(l)
就足以从
l
中删除重复项并保持顺序


1
投票

这是旧的 af,但是,如果有人仍然想知道它,谷歌搜索一下给了我这个非常简单的解决方案。

x = [1, 2, 6, 8, 2, 3]
y = [2, 6]
sorted(set(x) - set(y), key=x.index)

输出 -> [1, 8, 3]


0
投票

您应该仔细查看

l
并仅当其中的每个元素不在
l_match
中时才将其包含在结果数组中。这将保留订单。在Python中,该语句是一行:

print [entry for entry in l if entry not in l_match]

0
投票

这个怎么样:如何从列表中删除重复项,同时保持顺序?

l = ['gtttaattgagttgtcatatgttaataacg', 'tttaattgagttgtcatatgttaataacgg', 'ttaattgagttgtcatatgttaataacggt', 'taattgagttgtcatatgttaataacggta', 'aattgagttgtcatatgttaataacggtat']
seen = set()
seen_add = seen.add
print([ x for x in l if not (x in seen or seen_add(x))])

0
投票

尝试使用 filter():

result = list(filter(lambda c: c not in l_match, l))
© www.soinside.com 2019 - 2024. All rights reserved.