0

リストの辞書があり、リストには次のような辞書が含まれています。

my_dict = {
'list1': [{'catch': 100, 'id': '1'}, {'catch': 101, 'id': '2'}, 
          {'catch': 50, 'id': '1'}], 
'list2': [{'catch': 189, 'id': '1'}, {'catch': 120, 'id': '12'}], 
'list3': [{'catch': 140, 'id': '1'}, {'catch': 10, 'id': '100'}]
}

共通の 'id' 値を持つリスト項目を削除し、それらを別のリストに保存する最もPythonicな方法は何ですか? したがって、出力は次のようになります。

my_dict = {
'list1': [{'catch': 101, 'id': '2'}], 
'list2': [{'catch': 120, 'id': '12'}], 
'list3': [ {'catch': 10, 'id': '100'}],
'list4': [{'catch': 100, 'id': '1'}, , {'catch': 50, 'id': '1'}, 
          {'catch': 189, 'id': '1'}, {'catch': 140, 'id': '1'}]
}

私のプログラムには、これに似た7つのリストがあり、これらのリストの2つ以上に「id」が表示される場合、その「id」を持つアイテムのすべての外観を8番目のリストに保存して、さらに処理したいと考えています

よろしく、 finnurtorfa

4

3 に答える 3

3

データを次のように再構築することを検討してください。

>>> import itertools
>>> { k: [d['catch'] for d in v] for k, v in itertools.groupby(sorted(itertools.chain(*my_dict.itervalues()), key=lambda d: d['id']), lambda d: d['id']) }
{'1': [100, 50, 140, 189], '2': [101], '100': [10], '12': [120]}

データが何を表しているかを説明していないため、これは適切ではない可能性があります。chainしかし、使用された (およびgroupbyからの)ツールitertoolsは、少なくともいくつかのアイデアを提供するはずです。

編集:偶然、テストで質問のサンプル回答を使用しました。への入力に並べ替えを追加することで修正されましたgroupby

于 2012-12-26T16:07:05.727 に答える
2
>>> get_id = operator.itemgetter("id")
>>> flattened_dict = itertools.chain.from_iterable(my_dict.values())
>>> groups = itertools.groupby(sorted(flattened_dict, key=get_id), get_id)
>>> {k: list(v) for k, v in groups}
{'1': [{'catch': 100, 'id': '1'},
  {'catch': 50, 'id': '1'},
  {'catch': 140, 'id': '1'},
  {'catch': 189, 'id': '1'}],
 '100': [{'catch': 10, 'id': '100'}],
 '12': [{'catch': 120, 'id': '12'}],
 '2': [{'catch': 101, 'id': '2'}]}

説明:

  • get_idオブジェクトを受け取り、xを返す関数ですx["id"]
  • flattened_dictすべてのリストに対して反復可能です(つまり、すべてのリストを連結します.values()my_dict
  • 次にflattened_dict、キー関数get_id(つまり、IDで並べ替え)を使用して並べ替え、結果をIDでグループ化します。

これは基本的にitertools.groupbyは素晴らしいので機能します。

于 2012-12-26T16:02:04.317 に答える
0

次の行に沿った何か:

my_dict = {
'list1': [{'catch': 100, 'id': '1'}, {'catch': 101, 'id': '2'}, 
      {'catch': 50, 'id': '1'}], 
'list2': [{'catch': 189, 'id': '1'}, {'catch': 120, 'id': '12'}], 
'list3': [{'catch': 140, 'id': '1'}, {'catch': 10, 'id': '100'}]
}

from itertools import groupby

sub = {}
for k in my_dict:
 for kk, g in groupby( my_dict[k], lambda v: v["id"] ):
   if not kk in sub:
    sub[kk] = []
   sub[kk] = sub[kk] + list( g )

print sub

{'1': [{'catch': 100, 'id': '1'}, {'catch': 50, 'id': '1'}, {'catch': 140, 'id': '1'}, {'catch': 189, 'id': '1'}], '12': [{'catch': 120, 'id': '12'}], '100': [{'catch': 10, 'id': '100'}], '2': [{'catch': 101, 'id': '2'}]}
于 2012-12-26T16:02:59.873 に答える