我制作了一个程序,该程序删除了列表中的重复项,而我的本能是拥有一个新列表,然后在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),而不添加它直到2nd 9,它都必须梳理所有内容,new_list
以查看您正在查看的当前数字是否在其中-因此您需要迭代以下列表的总长度:
随着集更像:
因为一个集合不需要检查它的每个成员-它只是知道。现在使用一个包含1 ... 1000的1000个数字的列表,使用列表会变得越来越糟。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句