我想删除列表的重复项,是否有可能在有条件的情况下使用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个长数字),每个数字都触摸一次-加上:

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

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

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

随着集更像:

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在有条件的情况下删除SQL Server中的重复行?

在有条件的情况下使用“输入”

如何在有条件的情况下使用RemoveAll删除列表中的多个项目?

是否可以在有条件的情况下使用救援?

php函数返回一个布尔值,并在有条件的情况下使用它

在有条件的情况下“轮班”使用序列

如何在有条件的情况下使用ConcatMap进行多个API调用

C ++:是否有可能在没有返回的情况下终止非无效函数?

有条件的情况下如何避免重复?

使用结尾,是否有可能在没有关联的情况下取回资源?

仅在有条件的参数的情况下,忽略关于有条件地调用useState挂钩的反应警告是否安全?

如何在有条件的情况下删除y_train数组中值的百分比

删除有条件的重复项

MASM 是否可以在没有条件语句的情况下创建递归函数?

如何将rails slug url映射到id以在有条件的情况下使用

确保代码在有条件的情况下运行两次

如何在有条件的情况下替换冲突(对于SQLite)?

MySQL在有条件的情况下连接两列

熊猫在有条件的情况下将数组列转换为多列

熊猫:在有条件的情况下查找最大值

仅在有条件的情况下运行crontab

如何在有条件的情况下导出到CSV?

如何在有条件的情况下减去熊猫中的两列

Python Pandas:自连接,用于在有条件的情况下运行累计总数

在有条件的情况下,在标签的顶部添加标签。

Rails仅在有条件的情况下验证唯一性

Laravel如何在有条件的情况下进行雄辩的雄辩多次联接?

在有条件的情况下退出 Jess 中的规则执行

RegEx仅在有条件的情况下更换