我有以下这本字典
myDict={('A','X'): 1.0,
('B','Y'): 0.4,
('B','Z'): 0.6,
('C','X'): 0.1,
('C','Y'): 0.3,
('C','Z'): 0.6,
}
我需要与第一个键关联的列表。例如:
1)如果我提供第一个键“ A”,我想获取list1 = ['X']和list2 = [1.0]
2)如果我提供第一个键“ B”,我想获取list1 = ['Y','Z']和list2 = [0.4,0.6]
3)如果我提供第一个键“ C”,我想获取list1 = ['X','Y','Z']和list2 = [0.1,0.3,0.6]
根据我提供的第一个密钥,我只需要上述三种情况中的一种。
编辑:我的字典来自对此question的答案
有可能以一种简单的方式做到这一点吗?也许使用列表理解,但我无法做到这一点...
答案 0 :(得分:2)
如果您不想更改字典结构-
list2 = [val for ((key1, key2), val) in myDict.items() if key1=='A']
list1 = [key2 for ((key1, key2), val) in myDict.items() if key1=='A']
应该可以。但是,这并不是存储数据的最有效方法。
在'A'位置,您可以使用所需的键来放置变量。
答案 1 :(得分:1)
您可以使用嵌套字典。
myDict={'A': {'X':1.0, 'Y':0.4}} ...}
您可以得到这样的列表。
list(myDict['A'].keys()) #list1
list(myDict['A'].values()) #list2
答案 2 :(得分:1)
您可以使用collections.defaultdict
以O(n)的方式重组字典:
from collections import defaultdict
d = defaultdict(lambda: defaultdict(list))
for (k1, k2), v in myDict.items():
d[k1]['labels'].append(k2)
d[k1]['nums'].append(v)
结果:
print(d)
defaultdict({'A': defaultdict(list, {'labels': ['X'], 'nums': [1.0]}),
'B': defaultdict(list, {'labels': ['Y', 'Z'], 'nums': [0.4, 0.6]}),
'C': defaultdict(list, {'labels': ['X', 'Y', 'Z'],
'nums': [0.1, 0.3, 0.6]})})
那么每个数据调用将具有O(1)复杂度;例如:
print(d['C']['nums'])
[0.1, 0.3, 0.6]
答案 3 :(得分:1)
在遍历字典项并将值附加到子列表时,可以使用dict.setdefault
初始化两个列表。
o = {}
for (a, b), v in myDict.items():
o.setdefault(a, [[], []])[0].append(b)
o[a][1].append(v)
print(o)
这将输出:
{'A': [['X'], [1.0]], 'B': [['Y', 'Z'], [0.4, 0.6]], 'C': [['X', 'Y', 'Z'], [0.1, 0.3, 0.6]]}
答案 4 :(得分:1)
尝试这个:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import pprint
key = 'A'
myDict = {('A', 'X'): 1.0,
('B', 'Y'): 0.4,
('B', 'Z'): 0.6,
('C', 'X'): 0.1,
('C', 'Y'): 0.3,
('C', 'Z'): 0.6,
}
pprint.pprint(myDict.keys())
keys = myDict.keys()
list1 = list(filter(lambda x: x[0] == key, keys))
list2 = []
for item in list1:
tmp = list(filter(lambda x: x == item, myDict))
list2.append(tmp)
pprint.pprint(list1)
pprint.pprint(list2)