在python中标识列表中不同的元素并将其映射到另一个列表中相应的索引

2024-10-04 03:22:10 发布

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

我有两个不同的清单:

l1 = ['a','b','a','e','b','c','a','d']
l2 = ['t1','t2','t3','t4','t5','t6','t7','t8']

l1l2的长度总是相同的。它们实际上是逻辑映射l1中的每个项对应于l2中的一个值。你知道吗

我想在l1中识别不同的元素。我是用setlist comprehension做的,如下所示:

used = set()
distl1 = [x for x in l1 if x not in used and (used.add(x) or True)]

在这里,输出将是:

distl1 = ['a','b','e','c','d']

它只不过是每个不同元素的第一次出现。你知道吗

现在,我该如何构建一个列表distl2,以便将输出作为l2中与第一次出现的值相对应的值,即distl1?你知道吗

distl2 = ['t1','t2','t4','t6','t8']

Tags: in元素l1usedt1t3sett2
3条回答

Python 3.6+

字典在python3.6+中排序,作为3.6中的实现细节,在3.7+中确认。所以在本例中,可以将dict与忽略重复项的iterable一起使用。要忽略重复项,可以使用^{} ^{} recipe,也可以通过第三方^{}^{}获得:

from operator import itemgetter
from toolz import unique

l1 = ['a','b','a','e','b','c','a','d']
l2 = ['t1','t2','t3','t4','t5','t6','t7','t8']

keys, values = zip(*dict(unique(zip(l1, l2), key=itemgetter(0))).items())

print(keys)

('a', 'b', 'e', 'c', 'd')

print(values)

('t1', 't2', 't4', 't6', 't8')

Python 2.7

对于Python 2.7,可以使用^{}而不是dict,其中字典没有顺序:

from collections import OrderedDict

keys, values = zip(*OrderedDict(unique(zip(l1, l2), key=itemgetter(0))).items())

我的想法是使用OrderedDict来构建一个对应于l1l2元素的(键,值)对的映射,然后从该dict中提取values作为列表。你知道吗

>>> from collections import OrderedDict
>>> 
>>> l1 = ['a','b','a','e','d','c','a','b']
>>> l2 = ['t1','t2','t3','t4','t5','t6','t7','t8']
>>> 
>>> d = OrderedDict()
>>> for k, v in zip(l1, l2):
...:    if k not in d: # <--- check if this key has already been seen!
...:        d[k] = v
...:        
>>> distl2 = list(d.values())
>>> distl2
>>> ['t1', 't2', 't4', 't5', 't6']

注意:对于python3.7+用户:常规dict保证记住它们的键插入顺序,因此可以省略导入OrderedDict。你知道吗

您也可以这样做:

distl2 = [l2[l1.index(key)] for key in distl1]

相关问题 更多 >