0

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

4 に答える 4

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)
于 2013-05-17T07:49:47.717 に答える
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]]'''
于 2013-05-17T07:51:33.463 に答える
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}

于 2013-05-17T07:51:15.483 に答える