我想删除列表的重复项,在条件中使用 count() 函数时是否可以这样做?



我做了一个程序来删除列表中的重复项,我的第一直觉是有一个新列表,然后在for循环中遍历第一个列表,同时将所有值附加到这个新列表中。然后检查 if 语句,如果特定索引的 count(( 大于 2。然后删除该值。我只想知道我是否可以使用 count(( 函数来做到这一点,或者是否必须以我做的第二种方式来完成。 这是不起作用的解决方案,但我想弄清楚它是否可能。

numbers = [9,4,4,12,12,32,24,9]
new_list = []
for i in numbers:
new_list.append(i)
if i in new_list.count(i) > 2:
new_list.remove(i)
print(new_list)

这是实际有效的第二个解决方案。

numbers = [9,4,4,12,12,32,24,9]
new_list = []
for i in numbers:
if i not in new_list:
new_list.append(i)
print(new_list)

您的比较中有一个错误:

new_list.append(i)
if i in new_list.count(i) > 2:
new_list.remove(i)

应该是

new_list.append(i)
if i in new_list.count(i) == 2:
new_list.remove(i)

或更好:不要添加和删除,但仅在尚未添加时才添加

if new_list.count(i) == 0:    #  if i not in new_list:  looks nicer though
new_list.append(i)

使用.count()效率低下。 每次调用它时,它都需要触摸每个列表成员一次。对于数字 1...100 的 100 元素列表,它需要触摸每个元素 100 次 - 实际上是执行 100*100 次检查。


第二种方法更好,但仍然可以优化。在列表中查找包含是 O(n( - 这取决于列表的长度 - 改用集合 - 需要更多的空间来存储,但查找速度更快:

numbers = [9,4,4,12,12,32,24,9]
new_list = []
seen = set()
for i in numbers:
if i not in seen:      # O(1) lookup
new_list.append(i)
seen.add(i)        # but takes more space
print(new_list)

此优化仅对 len 10 以上以上的列表有意义 - 在此之前,使用 set 需要时间创建,将占用更多时间,然后使用 O(1( 查找来减少时间。


考虑您的代码:

numbers = [9,4,4,12,12,32,24,9]
new_list = []
for i in numbers:
if i not in new_list:
new_list.append(i)
print(new_list)

它遍历所有数字(8 长(,触摸每个数字一次 - 加上:

  • 它会检查9是否在new_list(0 长(中,然后将其添加到空new_list
  • 它会检查4是否在new_list(现在为 1 长(,然后将其添加到new_list
  • 它会检查4是否在new_list(现在 2 长(,而不是添加它
  • 它会检查12是否在new_list(现在 2 长(,然后将其添加到new_list
  • 它会检查12是否在new_list(现在 3 长(,而不是添加它
  • 它会检查32是否在new_list(现在长 3 个(,然后将其添加到new_list
  • 它会检查24是否在new_list(现在 4 长(,然后将其添加到new_list
  • 它会检查9是否在new_list中(现在长 4,首先找到 9(,而不是添加它

直到第 2 个 9,它必须梳理所有new_list以查看您正在查看的当前数字是否在其中 - 因此您需要迭代总列表长度:

  • 8(您的原始列表(+ 0 + 1 + 2 + 2 + 3 + 3 + 4 + 1(9 位于列表开头(== 24

有了集合,它更像:

8 + 1 + 1 + 1 + 1 + 1 + 1
  • + 1 + 1 = 16

因为集合不需要检查它的每一个成员 - 它只是知道。现在使用一个列表,其中包含 1000 个数字,从 1 ...1000,使用列表变得越来越糟。

如果您确实要使用计数,请替换该行

if i in new_list.count(i) > 2:

if new_list.count(i) >= 2:

您的版本正在尝试检查索引 i 是否在计数中,这没有意义,然后检查计数是否大于 2(而不是大于或等于 2(。

为什么不list(set(list(numbers)))

这将列出以设置(唯一值(并返回列表。 这将比查找每个插入元素的速度更快。

最新更新