Python:遍历列表并删除重复项(不使用Set())

时间:2017-04-26 01:02:08

标签: python list

所以我有一个清单:

s = ['cat','dog','cat','mouse','dog']

我希望能够遍历列表并删除重复项,而无需使用set()函数!因此,例如它应该删除'cat'和位置s [2]但是将'cat'保持在位置s [0]。然后它需要为'狗'做同样的事情,即。将'dog'保持在位置s [1],但从位置s [4]中移除'dog'。

那么输出就是:

s = ['cat','dog','mouse']

我试图在列表中使用i和j作为索引位置,并检查位置i处的元素是否等于位置j处的元素。如果是这样,它将删除它并将j的值递增1,否则它将离开它并且只增加j的值。在迭代完整个列表之后,它将递增i的值,然后再次检查整个列表,以获取新元素。下面:

i = 0
j = 1
for a in range(len(s)):
    for b in range(len(s)):
        if s[i] == s[j]:
            s.remove(s[j])
            j = j + 1
        else:
            j = j + 1
    i = i + 1

我在这里做错了什么?

7 个答案:

答案 0 :(得分:4)

迭代时不应更改列表,您可能会跳过元素或获取IndexError。如果您无法使用set使用collections.OrderedDict

>>> from collections import OrderedDict

>>> s = ['cat','dog','cat','mouse','dog']

>>> list(OrderedDict.fromkeys(s).keys())
['cat', 'dog', 'mouse']

答案 1 :(得分:3)

您可以遍历列表并检查是否已添加动物。

s = ['cat','dog','mouse','cat','horse','bird','dog','mouse']

sNew = []
for animal in s:
    if animal not in sNew:
        sNew.append(animal)

s = sNew

答案 2 :(得分:3)

问题在于"自动" for循环 - 在修改你正在迭代的东西时,你必须小心使用它们。这是正确的解决方案:

def remove_dup(a):
   i = 0
   while i < len(a):
      j = i + 1
      while j < len(a):
         if a[i] == a[j]:
            del a[j]
         else:
            j += 1
      i += 1

s = ['cat','dog','cat','mouse','dog']
remove_dup(s)
print(s)

Output: ['cat', 'dog', 'mouse']

此解决方案就位,修改原始数组而不是创建新数组。它也没有使用任何额外的数据结构。

答案 3 :(得分:1)

这是一个单行解决方案:

s = ['dog', 'cat', 'cat', 'mouse', 'dog']   

answer = [animal for idx, animal in enumerate(s) if a not in s[:idx]]

你会看到:

>>> answer
['cat', 'dog', 'mouse']

答案 4 :(得分:0)

我不确定你为什么不使用套装,但这里有另一种选择。迭代原始列表,将每个元素放入新列表中(如果它不在新列表中)。例如:

l = []
s = ['dog', 'cat', 'cat', 'mouse', 'dog']

for i in range(len(s)):
    if s[i] not in l:
        l.append(s[i])

现在:

>>> s
['dog', 'cat', 'mouse']

答案 5 :(得分:0)

s = ['cat','dog','cat','mouse','dog']
duplicates = []

for animal in s:
  if s.count(animal) > 1:
    if animal not in duplicates:
      duplicates.append(animal)
print(duplicates)

答案 6 :(得分:-1)

这里只是通过类型转换,

s = ['cat','dog','cat','mouse','dog']

l = list(set(s)) 

print(l)