Python dict:获取按键列表排序的值

时间:2013-05-17 07:45:08

标签: python dictionary

我不想使用numpy来处理2D矩阵

我想出了如何创建看起来像行和列字典的东西。如果我想查找单个值,它可以正常工作。

但是我无法弄清楚如何以与使用我的列相同的顺序从一行获取值

from collections import defaultdict

dic = defaultdict(dict)
rowKeys = ['1','2','3']
columnKeys = ['alfa', 'omega', 'bravo', 'charlie']

# Filling up the dictionary with values
from random import randrange
for rKey in rowKeys:
    for cKey in columnKeys:
        dic[rKey][cKey] = randrange(50)

""" 
    print dic
    defaultdict(<type 'dict'>, {
    '1': {'omega': 28, 'charlie': 42, 'alfa': 13, 'bravo': 45}, 
    '3': {'omega': 8, 'charlie': 5, 'alfa': 13, 'bravo': 4}, 
    '2': {'omega': 19, 'charlie': 42, 'alfa': 29, 'bravo': 26}})
"""
# print dic[rowKeys[0]].keys()
# ['omega', 'charlie', 'alfa', 'bravo']

# In [28]: print dic[rowKeys[0]].values()
# [28, 42, 13, 45]

我想要一个“原始”顺序的值列表

[13, 28, 45, 42]

是否有一种干净易读的方式来做到这一点?


更新

@jamylak找到了解决我特定问题的答案。

但是它没有真正回答我如何通过列表获取值的问题。假设我按字母顺序(或通过其他非逻辑顺序)更改columnKeys的顺序,并希望获得按该顺序返回的值列表。 我将如何处理 _ _?

4 个答案:

答案 0 :(得分:7)

from collections import defaultdict, OrderedDict

dic = defaultdict(OrderedDict)
rowKeys = ['1','2','3']
columnKeys = ['alfa', 'omega', 'bravo', 'charlie']

# Filling up the dictionary with values
from random import randrange

for rKey in rowKeys:
    for cKey in columnKeys:
        dic[rKey][cKey] = randrange(50)

答案 1 :(得分:2)

干净且易于阅读的方式将使用列表推导。

def readdict(D, rowkeys=(1, 2, 3)):

    def readcol(d, columnKeys=('alfa', 'omega', 'bravo', 'charlie')):
        return [d[key] for key in columnKeys]

    return [readcol(D[key]) for key in rowkeys]


'''outputs :

[[13, 28, 45, 42], 
 [29, 19, 26, 42], 
 [13,  8,  4,  5]]'''

答案 2 :(得分:1)

for row in dic.values(): #get each row 'dict'
    for k,v in sorted(row.items(),key=lambda k: columnKeys.index(k[0])): #sort base on index of key occurring in columnKeys
        print(k,v)

输出例如:

('alfa', 43)
('omega', 30)
('bravo', 24)
('charlie', 2)

{'omega': 29, 'charlie': 11, 'alfa': 4, 'bravo': 3}

答案 3 :(得分:0)

myDict = {'k42':'cat', 'k5':'fish', 'k1':'bird', 'k9':'dog'}
keyList = ['k1', 'k42', 'k9', 'k5']
outList = [myDict[x] for x in keyList]