在iterting时删除已排序python列表的重复项

在iterting时删除已排序python列表的重复项,python,list,Python,List,我有一个分类数据如下。我想比较它们并删除任何重复的内容。在这里,我做了一个简单的字段比较来测试代码。最初的要求是进行一些复杂的比较。因此,我需要明确地将前一个与后一个进行比较 比较并不是那么简单。这只是为了展示我将要取得的成就。有几个字段需要比较(但不是全部),删除以前的相同值,并保留新值,该值将具有递增的数字。因此,需要进行明确的比较。pop()和append()中有什么问题,即使我不迭代它? 我同时使用了list和deque。但也有重复的。代码有问题吗 import collections

我有一个分类数据如下。我想比较它们并删除任何重复的内容。在这里,我做了一个简单的字段比较来测试代码。最初的要求是进行一些复杂的比较。因此,我需要明确地将前一个与后一个进行比较

比较并不是那么简单。这只是为了展示我将要取得的成就。有几个字段需要比较(但不是全部),删除以前的相同值,并保留新值,该值将具有递增的数字。因此,需要进行明确的比较。pop()和append()中有什么问题,即使我不迭代它?

我同时使用了list和deque。但也有重复的。代码有问题吗

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在问题(第一行)中提到,数据已经排序。现在必须删除重复项。因此,对于您提到的输入,在排序之后,它可以很好地使用此代码。