如何在python中识别两个列表之间的关系/映射?

时间:2018-11-02 09:58:19

标签: python python-3.x

我创建了两个列表。

list1= [a,b,c,a,d]
list2=[1,2,3,4,5]

我想根据索引位置找到这两个列表之间的关系,即

在list1 a中将索引0,3重复2次。在list2索引0,3中的值是1 ,4,关系是一对多的是:{{1} }

下一个{1,4}在列表b中不重复,其索引为1,列表2索引1的值为1,关系是一对一的{ {1}}

我的预期输出将是2

6 个答案:

答案 0 :(得分:2)

我会使用defaultdict

from collections import defaultdict
list1 = ['a', 'b', 'c', 'a', 'd']
list2 = [1, 2, 3, 4, 5]
result = defaultdict(set)
for value1, value2, in zip(list1, list2):
    result[value1].add(value2)

print(dict(result))

输出

 {'a': {1, 4}, 'b': {2}, 'c': {3}, 'd': {5}}

答案 1 :(得分:2)

您可以结合使用字典和列表理解来做到这一点:

{x: [list2[i] for i, j in enumerate(list1) if j == x] for x in list1}

输出:

{'a': [1, 4], 'b': [2], 'c': [3], 'd': [5]}

答案 2 :(得分:0)

a = ['a', 'b', 'c', 'a', 'd']
b = [1, 2, 3, 4, 5]
ret = {}
for idx, _a in enumerate(a):
    value = ret.get(_a, ret.setdefault(_a, []))
    value.append(b[idx])

然后ret将成为输出

答案 3 :(得分:0)

选项是压缩两个列表:

MAX(DECODE(SPØRGSMÅL_ID, 47, KARAKTER)) AS SP1,
to_number(concat(concat(MAX(DECODE(SPØRGSMÅL_ID, 141, KARAKTER)),
MAX(DECODE(SPØRGSMÅL_ID, 161, KARAKTER))),
MAX(DECODE(SPØRGSMÅL_ID, 121, KARAKTER))), MAX(DECODE(SPØRGSMÅL_ID, 101, KARAKTER)) AS SP2

结果:

L = list(zip(list1, list2))

使用它来创建一个以值作为集合的字典:

 [('a', 1), ('b', 2), ('c', 3), ('a', 4), ('d', 5)]

答案 4 :(得分:0)

我不会在真实的代码中这样做,但是这种方法很有趣,甚至很有教育意义。

from collections import defaultdict
from itertools import groupby
from operator import itemgetter

xs = ['a', 'b', 'c', 'a', 'd']
ys = [1, 2, 3, 4, 5]

d = {
    x : set(y for _, y in group)
    for x, group in groupby(sorted(zip(xs, ys)), key = itemgetter(0))
}

print(d) # {'a': {1, 4}, 'b': {2}, 'c': {3}, 'd': {5}}

答案 5 :(得分:-1)

它不是来自纯python,因为这个问题是用pandas标记的,我是这样尝试的。

选项1

df=pd.DataFrame({'l1':list1,'l2':list2})
res1=df.groupby('l1').apply(lambda x:x.l2.values.tolist()).to_dict()

选项2

print df.groupby('l1')['l2'].unique().to_dict()

输出:

{'a': [1, 4], 'c': [3], 'b': [2], 'd': [5]}