![](/img/trans.png)
[英]remove duplicates without using remove or fromkeys;list slicing; python
[英]Python: Iterate through list and remove duplicates (without using Set())
所以我有一个清单:
s = ['cat','dog','cat','mouse','dog']
我希望能够遍历列表并删除重复项,而不使用 set() 函数! 因此,例如它应该删除“cat”和位置 s[2],但将“cat”保留在位置 s[0]。 然后它需要为“狗”做同样的事情,即。 将“狗”保留在位置 s[1],但从位置 s[4] 移除“狗”。
所以输出是:
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
我在这里做错了什么?
问题在于“自动” 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']
这个解决方案是就地的,修改原始数组而不是创建一个新数组。 它也不使用任何额外的数据结构。
您可以遍历列表并检查是否已添加动物。
s = ['cat','dog','mouse','cat','horse','bird','dog','mouse']
sNew = []
for animal in s:
if animal not in sNew:
sNew.append(animal)
s = sNew
在迭代列表时不应更改列表,您可能会跳过元素或得到IndexError
。 如果你不能使用set
使用collections.OrderedDict
:
>>> from collections import OrderedDict
>>> s = ['cat','dog','cat','mouse','dog']
>>> list(OrderedDict.fromkeys(s).keys())
['cat', 'dog', 'mouse']
这是一个单行解决方案:
s = ['dog', 'cat', 'cat', 'mouse', 'dog']
answer = [animal for idx, animal in enumerate(s) if a not in s[:idx]]
你会看到:
>>> answer
['cat', 'dog', 'mouse']
我不确定你为什么不使用 set,但这里有一个替代方案。 迭代您的原始列表,如果每个元素不在新列表中,则将其放入新列表中。 例子:
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']
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)
这里仅通过类型转换,
s = ['cat','dog','cat','mouse','dog']
l = list(set(s))
print(l)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.