2

辞書を含むpythonリストがあり、以下のような一意のキーと関連するリスト値を持つ辞書を含む新しいリストを作成したい:

Input:
 [{1: 2}, {2: 2}, {1: 3}, {2: 1}, {1: 3}]
Output:
 [{1:[2,3,3]},{2:[2,1]}]

前もって感謝します。

4

5 に答える 5

7

どうですか:

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():

  • この時点で、d は の要素になりますinput{1: 2}
  • d.items()に類似したものになります[(1, 2)]
  • 1 と 2 を x と y にアンパックするには、余分なものが必要です,(そうしないと、インタープリターは、単一要素のタプルを定義する代わりに、外側の括弧がグループ化を行っていると判断します)

r.setdefault(x, []).append(y)は次のようになります。

if not r.has_key(x):
     r[x] = []
r[x].append(y)
于 2012-07-06T08:13:31.447 に答える
3

トリックは、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 番目の引数でそのキーの新しいエントリを作成し、それを返します。どちらの方法でも、既存のものか新しいものかにかかわらず、リストを返すので、それに追加できます。

于 2012-07-06T08:14:03.647 に答える
0
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]]]})
于 2012-07-06T10:43:16.850 に答える
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]}]
于 2012-07-06T09:02:25.250 に答える
0
>>> 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]}]
于 2012-07-06T08:17:14.540 に答える