簡體   English   中英

以列表列表為值過濾字典

[英]Filtering Dictionary with List of Lists as Value

我有一本字典,其中的值是一個列表,例如:

Review_dict["0002"]

[['0002', '0292', '4', datetime.datetime(1998, 2, 27, 11, 1, 34)],
 ['0002', '0251', '5', datetime.datetime(1998, 2, 27, 12, 2, 24)],
 ['0002', '0050', '5', datetime.datetime(1998, 2, 27, 12, 3, 24)],
 ['0002', '0314', '1', datetime.datetime(1998, 3, 4, 10, 5, 45)]]

我想刪除某些列表(在“大”列表中),其中第二個元素 = '0251' 或 '0314'。

例如 Review_dict["0002"] 應該變成:

[['0002', '0292', '4', datetime.datetime(1998, 2, 27, 11, 1, 34)],
 ['0002', '0050', '5', datetime.datetime(1998, 2, 27, 12, 3, 24)]]

我想出了這段代碼,但我想知道是否有更簡單/更優雅的方式來做到這一點。

remove = ['0251', '0314']

for key in list(Review_dict):
    for ID in remove:
        for num in range(len(Review_dict[key])):
            if Review_dict[key][num][1] == ID:
                del Review_dict[key][num]

你可以改變你的外部字典的值:

remove = ['0251', '0314']

for v in Review_dict.values():
    v[:] = (lst for lst in v if lst[1] not in remove)

通常,不應從列表中重復刪除,因為每次刪除都具有線性復雜性。 從頭開始構建是更好的選擇。 這是否表現更好取決於您的數據以及實際要刪除的數據量。

作為一種突變,切片分配v[:] =...允許完全忽略外部字典的鍵,因為您不需要重新綁定它們。

您可以將列表理解用作:

import datetime
Review_dict = dict()

Review_dict["0002"] = [['0002', '0292', '4', datetime.datetime(1998, 2, 27, 11, 1, 34)],
 ['0002', '0251', '5', datetime.datetime(1998, 2, 27, 12, 2, 24)],
 ['0002', '0050', '5', datetime.datetime(1998, 2, 27, 12, 3, 24)],
 ['0002', '0314', '1', datetime.datetime(1998, 3, 4, 10, 5, 45)]]

print(Review_dict)
Review_dict["0002"] = [l for l in Review_dict["0002"] if l[1] not in ['0251', '0314']]
print(Review_dict)

Output:

{'0002': [['0002', '0292', '4', datetime.datetime(1998, 2, 27, 11, 1, 34)], ['0002', '0050', '5', datetime.datetime(1998, 2, 27, 12, 3, 24)]]}

在這里,您只取滿足條件的元素,即內部列表的第一個元素不存在於其他元素列表中。

您可以使用過濾方法並通過 lambda function

Review_dict["0002"] = list(filter(lambda x:x[1] not in remove,Review_dict["0002"]))

暫無
暫無

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

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