我有一个让我难过的特殊问题。假设我有以下两个列表:
x = ["A","B","C","D","E"]
y = [1,2,3,2,1]
x
和y
有关系。这种关系与指数挂钩。也就是说," A"涉及1," B"与2," C"相关与3等有关。
我要做的是创建一个键值关系,其中y
中的唯一项是键,每个键都有一个列表,其中包含与前面提到的键相关的字母。我试图做以下事情:
mapping = dict(zip(y,x))
{1: 'E', 2: 'D', 3: 'C'}
这会覆盖上一封信。我希望能够归还以下内容:
{1:['A','E'], 2:['B','D'], 3:['C']}
任何人都有这个聪明的解决方案吗?最好没有itertools。
答案 0 :(得分:6)
您可以使用setdefault
x = ["A","B","C","D","E"]
y = [1,2,3,2,1]
d = {}
for i,j in zip(y,x):
d.setdefault(i, []).append(j)
print d
输出:
{1: ['A', 'E'], 2: ['B', 'D'], 3: ['C']}
答案 1 :(得分:2)
defaultdict
是我对此类情况的偏好。
from collections import defaultdict
x = ["A","B","C","D","E"]
y = [1,2,3,2,1]
D = defaultdict(list)
for i, j in zip(x, y):
D[j].append(i)
print dict(D)
输出是:
{1: ['A', 'E'], 2: ['B', 'D'], 3: ['C']}
答案 2 :(得分:1)
这是一个聪明的,但O(n^2)
,因此不建议的解决方案,我想到了使用Python的词典&组合列表理解。
>>> x = ["A","B","C","D","E"]
>>> y = [1,2,3,2,1]
>>> {y[i] : [x[j] for j in range(len(y)) if y[j] == y[i]] for i in range(len(y))}
{1: ['A', 'E'], 2: ['B', 'D'], 3: ['C']}
为了它的价值,@ Joe R和@ mattingly890解决方案是可行的,因为它们是O(n)
解决方案
答案 3 :(得分:0)
这是一个简单(非聪明)的解决方案。我认为一个简单的解决方案更符合蟒蛇哲学而不是一个聪明的解决方案。 Perl是一种旨在最大限度地提高聪明度的语言,我发现它几乎不可读(不可否认,如果我能成为一名经验不足的Perl程序员,我就会避免使用它)。
x = ["A","B","C","D","E"]
y = [1,2,3,2,1]
assert(len(x) == len(y))
d = {}
for i in range(len(x)):
key = y[i]
val = x[i]
if key in d:
d[key].append(val)
else:
d[key] = [val, ]
print d