辞書を含むpythonリストがあり、以下のような一意のキーと関連するリスト値を持つ辞書を含む新しいリストを作成したい:
Input:
[{1: 2}, {2: 2}, {1: 3}, {2: 1}, {1: 3}]
Output:
[{1:[2,3,3]},{2:[2,1]}]
前もって感謝します。
辞書を含むpythonリストがあり、以下のような一意のキーと関連するリスト値を持つ辞書を含む新しいリストを作成したい:
Input:
[{1: 2}, {2: 2}, {1: 3}, {2: 1}, {1: 3}]
Output:
[{1:[2,3,3]},{2:[2,1]}]
前もって感謝します。
どうですか:
input = [{1: 2}, {2: 2}, {1: 3}, {2: 1}, {1: 3}]
r = {}
for d in input:
# (assumes just one key/value per dict)
((x, y),) = d.items()
r.setdefault(x, []).append(y)
print [ {k: v} for (k, v) in r.items() ]
結果:
[{1: [2, 3, 3]}, {2: [2, 1]}]
[アップデート]
((x, y),) = d.items()
ちょっと興味があります:とで何が起こっているのか説明できますr.setdefault(x, []).append(y)
か? –のろわれた
最初に((x, y),) = d.items()
:
input
。{1: 2}
d.items()
に類似したものになります[(1, 2)]
,
(そうしないと、インタープリターは、単一要素のタプルを定義する代わりに、外側の括弧がグループ化を行っていると判断します)r.setdefault(x, []).append(y)
は次のようになります。
if not r.has_key(x):
r[x] = []
r[x].append(y)
トリックは、dict.setdefault を使用してリストを開始し、それに追加することです。
input = [{1: 2}, {2: 2}, {1: 3}, {2: 1}, {1: 3}]
output = {}
for d in input:
for k,v in d.items():
output.setdefault(k, []).append(v)
# output contains {1: [2, 3, 3], 2: [2, 1]}
output=[{k:v} for k,v in output.items()]
# output contains [{1: [2, 3, 3]}, {2: [2, 1]}]
setdefault が行うことは、'k' でキー付けされた既存のリストを返すか、そのキーが辞書に存在しない場合は、2 番目の引数でそのキーの新しいエントリを作成し、それを返します。どちらの方法でも、既存のものか新しいものかにかかわらず、リストを返すので、それに追加できます。
output = []
for b in a:
added = 0
i = 0
for c in output:
if b.keys()[0] in c.keys():
output[i][b.keys()[0]].append(b[b.keys()[0]])
added = 1
i += 1
if not added:
output.append({b.keys()[0]: [b[b.keys()[0]]]})
>>> data = [{1: 2}, {2: 2}, {1: 3}, {2: 1}, {1: 3}]
...
... from itertools import groupby
...
... keyFn = lambda x: x.keys()[0]
...
... [{k: [i.values()[0] for i in g]} for k, g in groupby(sorted(data, key=keyFn), keyFn)]
0: [{1: [2, 3, 3]}, {2: [2, 1]}]
>>> lis=[{1: 2}, {2: 2}, {1: 3}, {2: 1}, {1: 3}]
>>> new_lis=[{}]
>>> for x in lis:
for y in x:
if y in new_lis[0]:
new_lis[0][y].append(x[y])
new_lis[0][y].sort()
else :new_lis[0][y]=[x[y]]
>>> new_lis
[{1: [2, 3, 3], 2: [1, 2]}]