2012-12-26 71 views
0

我有列表的字典和列表包含字典,像這樣:刪除常見的元素,從列表的字典在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的方式「 ID'值並將它們存儲在單獨的列表中?所以輸出會是這樣的:

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' 作進一步處理項目

與問候, finnurtorfa

+5

也許是時候重新考慮你的數據結構了吧? –

+0

@MartijnPieters而我完全同意 - 的時候會發生這種情況是從基於文檔的數據庫返回的對象列表... –

+0

什麼是字典鍵點現實生活中的例子嗎?我忽略了他們在我的答案,因爲它似乎他們並不真正意味着什麼,但也許他們這樣做...... – katrielalex

回答

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
  • 現在,我們的排序與鍵功能get_idflattened_dict的 - 那就是,排序ID - 和組結果由ID

這基本上可行的,因爲itertools.groupby是真棒

+0

問題要問你:你如何保持代碼的高爾夫這個問題的答案,如果你努力去兌現OP的需要移除的共同要素現有的名單,並把它們放入其他的?在你的解決方案中,list1 2 3被重新編號。 – Boud

+0

我不會把這個代碼打高爾夫球。我想「使用強大的工具,Python的爲您提供免費的」調用它。 – katrielalex

+0

爲了回答你的問題,這會有點痛苦,但是完全可行 - 但由於我不清楚OP究竟需要什麼,所以我不願意編寫需求來編寫令人討厭的代碼。 – katrielalex

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

您還沒有描述數據代表什麼,所以這可能並不適合你。但使用的工具(chaingroupbyitertools)應該至少給你一些想法。

編輯:我在測試中偶然使用了問題中的示例答案。通過向輸入groupby添加排序來修復。

+0

同意。所有數據實際上都是('id,catch')對的集合,您可以將它們存儲爲'id:[catch]'的字典。 – katrielalex

+0

你可能想使用'chain.from_iterable',這樣你就可以迭代這些值了。 – katrielalex

相關問題