如何在python中返回多维字典的关联键和值?

时间:2018-08-02 14:27:06

标签: python python-3.x list dictionary

我有以下这本字典

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

有可能以一种简单的方式做到这一点吗?也许使用列表理解,但我无法做到这一点...

5 个答案:

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