簡體   English   中英

從python中的列表字典中刪除常見元素

[英]Removing common elements from a dictionary of lists in python

我有一個列表字典,列表包含類似這樣的字典:

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'}]
}

什么是commin“身份證”的值刪除列表項並將其存儲在一個單獨的列表中最Python的方式? 所以輸出將是這樣的:

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個與此類似的列表,並且如果在兩個或多個這些列表中出現“ id”,我想將帶有“ id”的項目的所有外觀存儲在第8個列表中,以進行進一步處理

關於,Finnurtorfa

考慮將數據重組為如下形式:

>>> 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]}

您尚未描述數據代表的內容,因此這可能不適合您。 但是使用的工具(來自itertools chaingroupby )至少應該給您一些想法。

編輯:我偶然在測試中使用了問題的樣本答案。 通過將排序添加到groupby的輸入來解決。

>>> 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
  • 現在,我們使用鍵函數get_idflattened_dict進行排序(即,按ID排序),然后按id對結果進行分組。

這基本上是有效的,因為itertools.groupby非常棒。

遵循以下內容:

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'}]}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM