Python 3.6:使用另一个值作为索引创建新的dict

时间:2018-09-05 13:03:02

标签: python numpy dictionary dictionary-comprehension

在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']}

我的方法是局部的,因为我很难弄清楚如何告诉D3D1获取密钥和从D2获取值。我对and不太确定。有什么想法吗?

D3 = {key:list(D1.values())[v] for key in D1.keys() and v in D2[v]}

5 个答案:

答案 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。