我有一个字典,值是列表的列表,例如:
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)]]
我想删除某些列表(在"big">
。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)
输出:
{'0002': [['0002', '0292', '4', datetime.datetime(1998, 2, 27, 11, 1, 34)], ['0002', '0050', '5', datetime.datetime(1998, 2, 27, 12, 3, 24)]]}
这里只取满足条件的元素,即内部列表的第一个元素不存在于其他元素列表中。
您可以使用filter方法并传递lambda函数
Review_dict["0002"] = list(filter(lambda x:x[1] not in remove,Review_dict["0002"]))