我已经搜索了很多东西,但是还没有找到与此类似的问题。
我有两个以下格式的字典列表:
data1 = [
{'id': 4, 'date_time': datetime.datetime(2020, 4, 3, 12, 34, 40)},
{'id': 4, 'date_time': datetime.datetime(2020, 4, 3, 12, 34, 40)},
{'id': 6, 'date_time': datetime.datetime(2020, 4, 3, 12, 34, 40)},
{'id': 7, 'date_time': datetime.datetime(2020, 4, 3, 16, 14, 21)},
]
data2 = [
{'id': 4, 'date_time': datetime.datetime(2020, 4, 3, 12, 34, 40)},
{'id': 6, 'date_time': datetime.datetime(2020, 4, 3, 12, 34, 40)},
]
所需输出:
final_data = [
{'id': 4, 'date_time': datetime.datetime(2020, 4, 3, 12, 34, 40)},
{'id': 7, 'date_time': datetime.datetime(2020, 4, 3, 16, 14, 21)},
]
我只需要data1
中的字典,而不是data2
中的字典。
直到现在,当我在两个for循环中找到一个匹配项时,我将字典从列表中弹出,但这对我来说似乎不是一个好方法。如何获得所需的输出?
不必省时,因为每个列表中最多有数十个词典
counter_i = 0
for i in range(len(data1)):
counter_j = 0
for j in range(len(data2)):
if data1[i-counter_i]['id'] == data2[j-counter_j]['id'] and data1[i-counter_i]['date_time'] == data2[j-counter_j]['date_time']
data1.pop(i-counter_i)
data2.pop(j-counter_j)
counter_i += 1
counter_j += 1
break
如果性能不是问题,为什么不这样做:
for d in data2:
try:
data1.remove(d)
except ValueError:
pass
您可以采用任何一种方式:
方法1:
#using filter and lambda function
final_data = filter(lambda i: i not in data2, data1)
final_data = list(final_data)
方法2:
# using list comprehension to perform task
final_data = [i for i in data1 if i not in data2]