1

リストの 1 つに基づいて辞書 (リスト) の値を並べ替えたいと思います。たとえば、辞書があるとします。

data = {'AttrA':[2,4,1,3],'AttrB':[12,43,23,25],'AttrC':['a','d','f','z']}

AttrA に関連付けられた値に基づいて、次のように並べ替えたいと思います。

data = {'AttrA':[1,2,3,4],'AttrB':[23,12,25,43],'AttrC':['f','a','z','d']}

前もって感謝します!

4

3 に答える 3

6

と を使用して、data['AttrA']ソース リストに基づいて辞書内の各値を並べ替えます。これらはすべてわずか 3 行のコードで実行できます。sorted()zip()

base = data['AttrA'] # keep a reference to the original sort order
for key in data:
    data[key] = [x for (y,x) in sorted(zip(base, data[key]))]

デモ:

>>> data = {'AttrA': [2, 4, 1, 3], 'AttrB': [12, 43, 23, 25], 'AttrC': ['a', 'd', 'f', 'z']}
>>> base = data['AttrA']
>>> for key in data:
...     data[key] = [x for (y,x) in sorted(zip(base, data[key]))]
... 
>>> data
{'AttrB': [23, 12, 25, 43], 'AttrC': ['f', 'a', 'z', 'd'], 'AttrA': [1, 2, 3, 4]}
于 2013-07-22T20:43:43.600 に答える
1
from operator import itemgetter
data = {'AttrA':[2,4,1,3],'AttrB':[12,43,23,25],'AttrC':['a','d','f','z']}

sort = itemgetter(*[i for i, v in sorted(enumerate(data['AttrA']), key=itemgetter(1))])
data = dict((k, list(sort(v))) for k, v in data.items())

または、より短いが効率の悪い作成方法sort:

sort = itemgetter(*[data['AttrA'].index(v) for v in sorted(data['AttrA'])])

結果:

>>> data
{'AttrB': [23, 12, 25, 43], 'AttrC': ['f', 'a', 'z', 'd'], 'AttrA': [1, 2, 3, 4]}

これはoperator.itemgetter、 によって決定された順序でシーケンスからアイテムを取得するソート関数を作成し、data['AttrA']そのソート関数をディクショナリの各値に適用するために使用します。

于 2013-07-22T20:46:29.687 に答える
0

テストされていませんが、動作するはずです (または、少なくとも開始するには適しています)。

data = {'AttrA':[2,4,1,3],'AttrB':[12,43,23,25],'AttrC':['a','d','f','z']}
sortkey = 'AttrA'
sortedval = sorted(data['AttrA'])
valmaps = {i:sortedvals.find(num) for i,num in enumerate(data['AttrA'])}
newData = {k:[v[valmaps[i]] for i,_num in enumerate(v)] for k,v in data.items()}

お役に立てれば

于 2013-07-22T20:43:52.660 に答える