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

2024-05-16 20:33:19 发布

您现在位置:Python中文网/ 问答频道 /正文

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

比较并不是那么简单。这只是为了展示我将要取得的成就。有几个字段需要比较(但不是全部),删除以前的相同值,并保留新值,该值将具有递增的数字。因此,需要进行明确的比较。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}])


Tags: 数据name内容agedata分类popcollections
3条回答

您可以尝试以下代码:

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])

因此,如果满足“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}])
data = [
    {'name': 'Atomic', 'age': 28},
    {'name': 'Atomic', 'age': 28},
    {'name': 'Atomic', 'age': 28},
    {'name': 'Atomic', 'age': 29},
]

unique = set((tuple(x.items()) for x in data))
print([dict(x) for x in unique])

[{'name': 'Atomic', 'age': 28}, {'name': 'Atomic', 'age': 29}]

相关问题 更多 >