在Python 3.6.3中,我有以下命令D1
:
D1 = {0: array([1, 2, 3], dtype=int64), 1: array([0,4], dtype=int64)}
数组中的每个值是另一个字典D2
的键的索引:
D2 = {'Jack': 1, 'Mike': 2, 'Tim': 3, 'Paul': 4, 'Tommy': 5}
我正在尝试创建第三个字典D3
,其键与D1
相同,并且将值D2
的键对应于D1.values()
的索引
我想要的结果是:
D3 = {0: ['Mike','Tim','Paul'], 1: ['Jack','Tommy']}
我的方法是局部的,因为我很难弄清楚如何告诉D3
从D1
获取密钥和从D2
获取值。我对and
不太确定。有什么想法吗?
D3 = {key:list(D1.values())[v] for key in D1.keys() and v in D2[v]}
答案 0 :(得分:5)
您可以像这样使用dict-comprehension:
__init__
结果为:
from numpy import array
D1 = {0: array([1, 2, 3]), 1: array([0,4])}
D2 = {'Jack': 1, 'Mike': 2, 'Tim': 3, 'Paul': 4, 'Tommy': 5}
temp = dict(zip(D2.values(), D2.keys())) # inverting key-value pairs
D3 = {k: [temp.get(i+1, 'N\A') for i in v] for k, v in D1.items()}
答案 1 :(得分:1)
这是未经测试的,但我相信这应该使您朝正确的方向前进。我发现有时将一个复杂的单行分成多行很有帮助
D3={}
for d1k,d1v in D1.items():
D3[d1k] = []
for idx in d1v:
D3[d1k].append(D2[idx])
答案 2 :(得分:1)
如果您使用的是Python 3.6+,则可以使用enumerate
创建字典以按索引查找D2
中的名称,然后将D1
中的索引映射到它:
r = dict(enumerate(D2))
D3 = {k: list(map(r.get, v)) for k, v in D1.items()}
D3将变为:
{0: ['Mike', 'Tim', 'Paul'], 1: ['Jack', 'Tommy']}
答案 3 :(得分:1)
可能不是最好的解决方案,但是可行
D3={}
for key in D1.keys():
value_list=D1.get(key)
value_list= [(lambda x: x+1)(x) for x in value_list]
temp=[]
for d2_key,value in D2.items():
if value in value_list:
temp.append(d2_key)
D3[key]=temp
输出:
{0: ['Tim', 'Mike', 'Paul'], 1: ['Jack', 'Tommy']}
答案 4 :(得分:1)
您在这里!
D1 = {0:[1, 2, 3], 1: [0,4]}
D2 = {'Jack': 1, 'Mike': 2, 'Tim': 3, 'Paul': 4, 'Tommy': 5}
D2_inverted = {v: k for k, v in D2.iteritems()}
D3={}
for key in D1:
temp = []
for value in D1[key]:
temp.append(D2_inv[value+1])
D3[key] = temp
print D3
从D1迭代密钥;
创建一个临时列表以存储您希望分配给新字典的值,并用D2中的所需值填充它。 (为简单起见,将其键和值取反);
分配给D3。