第一个问题是for i in list1: 迭代列表中的元素,不是索引,所以有了i,你手中就有了一个元素。
接下来是num,它是一个索引,但您似乎以错误的方式递增它。
我建议您使用以下代码:
for i in range(len(list1)):
unique = True
for j in range(len(list1)):
if i != j and list1[i].lower() == list1[j].lower():
unique = False
break
if unique:
list2.append(list1[i])
这是如何工作的:这里i 和j 是索引,您现在遍历列表,使用i 遍历您可能想要添加的元素的索引,现在您进行测试:您检查列表中的某处是否看到另一个相等的元素。如果是这样,您将unique 设置为False 并为下一个元素执行此操作,否则您添加。
您还可以使用for-else 构造,如@YevhenKuzmovych 说:
for i in range(len(list1)):
for j in range(len(list1)):
if i != j and list1[i].lower() == list1[j].lower():
break
else:
list2.append(list1[i])
您可以使用any 使代码更优雅:
for i in range(len(list1)):
if not any(i != j and list1[i].lower() == list1[j].lower() for j in range(len(list1))):
list2.append(list1[i])
现在这更优雅但仍然不是很有效。为了提高效率,您可以使用Counter:
from collections import Counter
ctr = Counter(x.lower() for x in list1)
一旦你构建了计数器,你就会查找你看到元素的次数,如果它小于 2,你就将它添加到列表中:
from collections import Counter
ctr = Counter(x.lower() for x in list1)
for element in list1:
if ctr[element.lower()] < 2:
list2.append(element)
最后你现在甚至可以使用 列表推导 让它变得非常优雅:
from collections import Counter
ctr = Counter(x.lower() for x in list1)
list2 = [element for element in list1 if ctr[element.lower()] < 2]