在iterting时删除已排序python列表的重复项
我有一个分类数据如下。我想比较它们并删除任何重复的内容。在这里,我做了一个简单的字段比较来测试代码。最初的要求是进行一些复杂的比较。因此,我需要明确地将前一个与后一个进行比较 比较并不是那么简单。这只是为了展示我将要取得的成就。有几个字段需要比较(但不是全部),删除以前的相同值,并保留新值,该值将具有递增的数字。因此,需要进行明确的比较。pop()和append()中有什么问题,即使我不迭代它? 我同时使用了list和deque。但也有重复的。代码有问题吗在iterting时删除已排序python列表的重复项,python,list,Python,List,我有一个分类数据如下。我想比较它们并删除任何重复的内容。在这里,我做了一个简单的字段比较来测试代码。最初的要求是进行一些复杂的比较。因此,我需要明确地将前一个与后一个进行比较 比较并不是那么简单。这只是为了展示我将要取得的成就。有几个字段需要比较(但不是全部),删除以前的相同值,并保留新值,该值将具有递增的数字。因此,需要进行明确的比较。pop()和append()中有什么问题,即使我不迭代它? 我同时使用了list和deque。但也有重复的。代码有问题吗 import collections
import collections
data = [
{'name': 'Atomic', 'age': 28},
{'name': 'Atomic', 'age': 28},
{'name': 'Atomic', 'age': 28},
{'name': 'Atomic', 'age': 29},
]
dq = collections.deque()
for i in range(1, len(data)):
prev_name = data[i-1]['name']
prev_age = data[i-1]['age']
next_name = data[i]['name']
next_age = data[i]['age']
dq.append(data[i-1])
if prev_name == next_name and prev_age == next_age:
dq.pop()
dq.append(data[i])
else:
dq.append(data[i])
print(dq)
输出(实际):deque([{'name':'Atomic','age':28},{'name':'Atomic','age':28},{'name':'Atomic','age':28},{'name':'Atomic','age':29}])
输出(应为):
deque([{'name':'Atomic','age':28},{'name':'Atomic','age':29}])
您可以尝试以下代码:
import collections
data = [
{'name': 'Atomic', 'age': 28},
{'name': 'Atomic', 'age': 28},
{'name': 'Atomic', 'age': 28},
{'name': 'Atomic', 'age': 29},
]
dq = collections.deque()
for i in range(0, len(data)):
if data[i] not in dq:
dq.append(data[i])
print(dq)
输出:
deque([{'name': 'Atomic', 'age': 28}, {'name': 'Atomic', 'age': 29}])
您可以尝试以下代码:
import collections
data = [
{'name': 'Atomic', 'age': 28},
{'name': 'Atomic', 'age': 28},
{'name': 'Atomic', 'age': 28},
{'name': 'Atomic', 'age': 29},
]
dq = collections.deque()
for i in range(0, len(data)):
if data[i] not in dq:
dq.append(data[i])
print(dq)
输出:
deque([{'name': 'Atomic', 'age': 28}, {'name': 'Atomic', 'age': 29}])
代码的问题是,您首先要附加上一个数据元素,然后如果当前变量和上一个变量相同,则您要删除最后一个元素,但您没有考虑的是,在中删除上一个元素后添加当前元素后:
dq.pop()
dq.append(data[i])
dq.append(data[i-1])
在下一次迭代中,您将再次将先前添加的元素添加到:
dq.pop()
dq.append(data[i])
dq.append(data[i-1])
因此,如果满足“if”条件,那么它将只从dq中删除最后一个元素(即数据[i-1]),而不是先前在dq中输入的最后一个元素。因此,在这里,它与相同的元素被复制
您可以尝试以下代码:
import collections
data = [
{'name': 'Atomic', 'age': 28},
{'name': 'Atomic', 'age': 28},
{'name': 'Atomic', 'age': 28},
{'name': 'Atomic', 'age': 29},
{'name': 'Atomic', 'age': 29},
{'name': 'Atomic', 'age': 30},
]
dq = collections.deque()
dq.append(data[0])
for i in range(1, len(data)):
prev_name = dq[-1]['name']
prev_age = dq[-1]['age']
next_name = data[i]['name']
next_age = data[i]['age']
if prev_name == next_name and prev_age == next_age:
continue
else:
dq.append(data[i])
print(dq)
输出:
deque([{'name': 'Atomic', 'age': 28}, {'name': 'Atomic', 'age': 29}, {'name': 'Atomic', 'age': 30}])
代码的问题是,您首先要附加上一个数据元素,然后如果当前变量和上一个变量相同,则您要删除最后一个元素,但您没有考虑的是,在中删除上一个元素后添加当前元素后:
dq.pop()
dq.append(data[i])
dq.append(data[i-1])
在下一次迭代中,您将再次将先前添加的元素添加到:
dq.pop()
dq.append(data[i])
dq.append(data[i-1])
因此,如果满足“if”条件,那么它将只从dq中删除最后一个元素(即数据[i-1]),而不是先前在dq中输入的最后一个元素。因此,在这里,它与相同的元素被复制
您可以尝试以下代码:
import collections
data = [
{'name': 'Atomic', 'age': 28},
{'name': 'Atomic', 'age': 28},
{'name': 'Atomic', 'age': 28},
{'name': 'Atomic', 'age': 29},
{'name': 'Atomic', 'age': 29},
{'name': 'Atomic', 'age': 30},
]
dq = collections.deque()
dq.append(data[0])
for i in range(1, len(data)):
prev_name = dq[-1]['name']
prev_age = dq[-1]['age']
next_name = data[i]['name']
next_age = data[i]['age']
if prev_name == next_name and prev_age == next_age:
continue
else:
dq.append(data[i])
print(dq)
输出:
deque([{'name': 'Atomic', 'age': 28}, {'name': 'Atomic', 'age': 29}, {'name': 'Atomic', 'age': 30}])
显示预期的输入和输出output@python_user我认为这里的输入和输出是非常清楚的…我需要明确的比较,因为要求不是简单的重复删除。这回答了你的问题吗?显示预期的输入和输出output@python_user我认为这里的输入和输出是非常清楚的…我需要明确的比较,因为要求不是简单的重复删除。这回答了你的问题吗@马克:噢,谢谢你,我弄错了。(修改完成)@Marc哦谢谢你,我弄错了。(修改完成)@Marc在问题(第一行)中提到数据已经排序。现在必须删除重复项。因此,对于您提到的输入,排序后,它将与此代码一起工作。@Marc在问题(第一行)中提到,数据已经排序。现在必须删除重复项。因此,对于您提到的输入,在排序之后,它可以很好地使用此代码。