Python 以列表列表作为值筛选字典

Python 以列表列表作为值筛选字典,python,python-3.x,list,loops,dictionary,Python,Python 3.x,List,Loops,Dictionary,我有一本字典,其值是列表列表,例如: 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)],

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

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'

e、 g.审查指令[“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]

您可以只改变外部dict的值:

remove = ['0251', '0314']

for v in Review_dict.values():
    v[:] = (lst for lst in v if lst[1] not in remove)
通常,不应重复从列表中删除,因为每次删除都具有线性复杂性。从头开始建设是更好的选择。这是否更好取决于您的数据以及实际需要删除的数据量


作为一种变异,切片分配
v[:]=…
允许完全忽略外部dict的键,因为您不需要重新绑定它们。

您可以将列表理解用作:

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)
输出:

{'0002': [['0002', '0292', '4', datetime.datetime(1998, 2, 27, 11, 1, 34)], ['0002', '0050', '5', datetime.datetime(1998, 2, 27, 12, 3, 24)]]}
此处仅获取满足条件的元素,即内部列表的第一个元素不存在于其他元素列表中。

您可以使用并传递lambda函数

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

优雅而高效。竖起大拇指。