簡體   English   中英

從兩個dicts列表中刪除匹配項

[英]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.

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