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

4
我有两个列表ll_matchl_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']

你能提出修改建议吗?


1
Python中的集合不保证顺序。 - Cody Bouche
set([])set()是一样的,减去空集合后仍然是它本身。你想要做什么? - Two-Bit Alchemist
所以,您想要在l_match中没有的所有元素在l中? - mgilson
5个回答

2

只需将l_match定义为一个集合:

l_match = []

st =  set(l_match)

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

如果列表 l 可以有重复值,使用 OrderedDict 来获取唯一值:
from collections import OrderedDict
print([ele for ele in OrderedDict.fromkeys(l) if ele not in st])

显然,l_match会包含现实世界中的值,或者简单地使用l[:] = OrderedDict.fromkeys(l)即可从l中删除重复项并保留顺序。

但是...但是...根据定义,l_match中没有任何内容。这有什么意义呢? - Two-Bit Alchemist
@Two-BitAlchemist,我认为OP实际上是想使用一个带有值的列表,我认为顺序是问题的重点,否则除了从l中删除重复项外就没有任何意义了。 - Padraic Cunningham
l_match设置为集合有什么好处?与使用ele not in l_match有何不同之处? - Robin James Kerrison
2
@RobinJamesKerrison,在实际的使用案例中,当列表实际上有值时,这是二次和线性之间的区别。 - Padraic Cunningham
@PadraicCunningham 我也希望如此,但我不明白为什么示例代码中它是空的。 - Two-Bit Alchemist

1

这个已经老掉牙了,但是如果有人仍然想知道,我通过一些简单的谷歌搜索找到了这个非常简单的解决方案。

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

输出 -> [1, 8, 3]


0
尝试使用filter()
result = list(filter(lambda c: c not in l_match, l))

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接