![](/img/trans.png)
[英]Flatten two lists of dicts by matching inner dicts property in python?
[英]Removing matching items from two lists of dicts
我需要使用兩個字典並過濾掉無法識別名稱的“垃圾”項:
data = [
{'annotation_id': 22, 'record_id': 5, 'name': 'Joe Young'},
{'annotation_id': 13, 'record_id': 7, 'name': '----'},
{'annotation_id': 12, 'record_id': 9, 'name': 'Greg Band'},
]
garbage = [
{'annotation_id': 13, 'record_id': 7, 'name': '----'}
]
所以在這種情況下,我需要從數據中刪除annotation_id 13。
我嘗試迭代列表並刪除它但我明白在python中不能很好地工作。 我也嘗試了列表理解,但也失敗了。 我做錯了什么? 我的代碼如下:
data = [[item for item in data if item['name'] != g['name'] for g in garbage]
上面的代碼創建了許多重復版本的dicts。
刪除dicts數組中特定條目的簡單而優雅的方法,其中garbage
是要從data
刪除的dicts條目列表:
for g in garbage:
if g in data:
data.remove(g)
輸入數據:
data = [
{'annotation_id': 22, 'record_id': 5, 'name': 'Joe Young'},
{'annotation_id': 13, 'record_id': 7, 'name': '----'},
{'annotation_id': 12, 'record_id': 9, 'name': 'Greg Band'},
]
garbage = [
{'annotation_id': 13, 'record_id': 7, 'name': '----'}
]
結果:
data = [
{'record_id': 5, 'annotation_id': 22, 'name': 'Joe Young'},
{'record_id': 9, 'annotation_id': 12, 'name': 'Greg Band'}
]
您可以創建一個集來保存垃圾名稱,然后根據此名稱集過濾數據 (如果name是您需要過濾的標准):
garbage_names = {d['name'] for d in garbage}
[item for item in data if item['name'] not in garbage_names]
#[{'annotation_id': 22, 'name': 'Joe Young', 'record_id': 5},
# {'annotation_id': 12, 'name': 'Greg Band', 'record_id': 9}]
正如在評論中已經注意到的那樣,你也可以按照你的原始方法做[item for item in data if all(item['name'] != g['name'] for g in garbage)]
但會略微減少由於雙循環有效,其時間復雜度為O(M * N),而預先建立一個集合將時間復雜度降低到O(M + N),這里有一些天真的時間:
%timeit [item for item in data if all(item['name'] != g['name'] for g in garbage)]
# 1000000 loops, best of 3: 1.68 µs per loop
%%timeit
garbage_names = {d['name'] for d in garbage}
[item for item in data if item['name'] not in garbage_names]
# 1000000 loops, best of 3: 608 ns per loop
一個簡單的filter
怎么樣?
filter(lambda x: x not in garbage, data)
[{'annotation_id': 22, 'name': 'Joe Young', 'record_id': 5},
{'annotation_id': 12, 'name': 'Greg Band', 'record_id': 9}]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.