Python: 根据元组作为键的值对字典进行排序

4

我有一个以元组为键的字典,例如:

d={('w1','u1'):3,('w1','u2'):8,('w2','u1'):1,('w1','u3'):11,('w2','u3'):6}

现在我想要收集每个“w”下的所有项目,即键中的第一个元素:
'w1' :  ('w1','u1'):3 ('w1','u2'):8 ('w1','u3'):11 -------
'w2' :  ('w2','u1'):1 ('w2','u3'):6 

然后按照数值对每行进行排序,得到:

'w1' : 'u3':11 'u2':8 'u1':3 -------
'w2' :  'u3':6 'u1':1

有谁能给我一些提示去做吗?谢谢。


你的意思是要创建一个嵌套字典?例如:'w1': {('w1', 'u1'): 3, ('w1', 'u2'): 8, ...}?顺便说一下:我不明白为什么要在嵌套字典中保留 'w1'。使用 'w1': {'u1': 3, 'u2': 8, ...} 可以提供完全相同的信息。 - Bakuriu
2个回答

3
这样可以得到所需的结果,已排序。但它不是以字典形式输出的,因为字典无法排序。
d={('w1','u1'):3,('w1','u2'):8,('w2','u1'):1,('w1','u3'):11,('w2','u3'):6}

d2 = {}

for (w,u) , value in d.items():
    if w not in d2:
        d2[w] = [(u,value)]
    else:
        d2[w].append((u, value))


for key, values in d2.items():
    print key, ":\t", sorted(values, key=lambda x: -x[1]), "\n"

这将会给出:

w2 :    [('u3', 6), ('u1', 1)] 

w1 :    [('u3', 11), ('u2', 8), ('u1', 3)] 

2

鉴于您最终想要的是一个字典 dict,我认为您不需要进行排序。只需遍历键值对,并将它们重新排列成一个新字典:

d = {('w1', 'u1'): 3, ('w1', 'u2'): 8, ('w2', 'u1'): 1, ('w1', 'u3'): 11,
     ('w2', 'u3'): 6}
result = {}
for (w, u), val in d.iteritems():
    result.setdefault(w, {})[u] = val
print(result)

产量
{'w2': {'u1': 1, 'u3': 6}, 'w1': {'u1': 3, 'u3': 11, 'u2': 8}}

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