写一个Python程序从整数列表中删除重复的整数,保持顺序

azpvetkf  于 2023-06-04  发布在  Python
关注(0)|答案(4)|浏览(365)

所以这是问题,我用Python语言实现了它,但代码中有错误,我无法修复它,所以请帮助。我也在添加代码。

def delete23(a):
    for i in range(0, len(a) - 1):
        for j in range(0, len(a) - 1):
            if a[i] == a[j] and i != j:
                a.pop(j)
    print(a)

a = [1, 2, 3, 4, 4, 1, 7]
print(len(a))
delete23(a)

wswtfjt7

wswtfjt71#

当你在列表中向前迭代时,你不能“弹出”值,因为下一个索引将被跳过(因为后续的项被移动了一个位置),列表的长度将减少,这会导致你的循环越界。
如果你以索引的相反顺序处理列表,这不会是一个问题,因为移位的位置只会在你已经处理过的索引上(只要你从外部循环i而不是j弹出索引)。
例如:

a = [1, 2, 3, 4, 4, 1, 7]

for i in reversed(range(len(a))): # going backward through positions
    if a.index(a[i]) < i:         # if another exists before i
        a.pop(i)                  # remove the duplicate at i

print(a)
[1, 2, 3, 4, 7]

或者,您可以使用字典来过滤掉重复项(仅保留唯一键并保持原始顺序):

a = [1, 2, 3, 4, 4, 1, 7]

*a, = dict.fromkeys(a)

[1, 2, 3, 4, 7]

如果不需要保留顺序,则可以使用set。

a = [1, 2, 3, 4, 4, 1, 7, 5]  # added a 5 to illustrate loss of order

*a, = {*a}

[1, 2, 3, 4, 5, 7]
kqlmhetl

kqlmhetl2#

为了在保持顺序的同时过滤重复项,经常使用一组可见值。逻辑很简单:如果一个值还没有出现在SEEN中,则该值是第一次遇到。

lst = [1, 2, 3, 4, 4, 1, 7]

seen = set()
lst2 = []
for x in lst:
    if x not in seen:
        seen.add(x)
        lst2.append(x)
    
print(lst2)

通过一个小技巧,可以缩短:

seen = set()
lst2 = [(seen.add(x) or x) for x in lst if x not in seen]

print(lst2)

解释(...)中的表达式:set.add返回None(None or VALUE)的计算结果为VALUE
警告:所有使用set或dict的解决方案都要求所有值都是可散列的。

cnwbcb6i

cnwbcb6i3#

我也在考虑dict.fromkeys(),但是,@Alain已经回答得很好了。
more_itertools中有一个方法可以保持顺序。

from more_itertools import unique_everseen
a = [1, 2, 3, 4, 4, 1, 7]
list(unique_everseen(a))
#[1, 2, 3, 4, 7]
wnrlj8wa

wnrlj8wa4#

enter code here
a = [1,1,2,3,3,4,7,7]
set1 = set(a)
b = []
for i in set1:
   for j in range(0, len(a) - 1):
       if(i == a[j]):
           b.append(a[j])
           break
print(b)

相关问题