Posts: 4 Threads: 1 Joined: Jun 2019 Reputation: 0 Likes received: 0 Jun142019, 03:13 PM (This post was last modified: Jun142019, 03:28 PM by Yoriz. Edited 2 times in total. Edit Reason: Added code tags ) hi, there! i am new to python and i was trying to remove duplicate numbers in a list using for loop. but the code doesn't quite work numbers = [3, 3, 20, 6, 10, 6, 5, 5, 7, 10, 7, 19, 19, 20]
for x in numbers:
if numbers.count(x) > 1:
numbers.remove(x)
print(numbers) it doesn't remove all the duplicates. this is what i get when i run it. Output: [3, 6, 6, 5, 10, 7, 19, 20]
Posts: 4,129 Threads: 259 Joined: Sep 2016 Reputation: 109 Likes received: 1049 Jun142019, 03:46 PM (This post was last modified: Jun142019, 03:46 PM by metulburr. Edited 1 time in total.) >>> numbers = [3, 3, 20, 6, 10, 6, 5, 5, 7, 10, 7, 19, 19, 20]
>>> list(set(numbers))
[3, 5, 6, 7, 10, 19, 20]
or >>> from collections import OrderedDict
>>> numbers = [3, 3, 20, 6, 10, 6, 5, 5, 7, 10, 7, 19, 19, 20]
>>> list(OrderedDict.fromkeys(numbers))
[3, 20, 6, 10, 5, 7, 19]
snippsat likes this post Posts: 45 Threads: 0 Joined: Jun 2019 Reputation: 7 Likes received: 12 @calonia Modifying a list whilst iterating over it is a very bad idea. The 2nd example from @metulburr is perfect as it keeps the order of the items in the original list. If that doesn´t matter his 1st example is faster. In addition your runtime is O(len(numbers)*len(numbers)) which is bad. numbers.count(x) runs over the full list and counts each number. Try to do this in O(len(numbers) which is possible. (not using above examples) :) snippsat and metulburr like this post Posts: 3,420 Threads: 78 Joined: Sep 2016 Reputation: 216 Likes received: 1036 Also from 3.6 and guaranteed in 3.7 so are dictionaries ordered. This mean that can drop import of OrderedDict,and just use dict() . >>> numbers = [3, 3, 20, 6, 10, 6, 5, 5, 7, 10, 7, 19, 19, 20]
>>> list(dict.fromkeys(numbers))
[3, 20, 6, 10, 5, 7, 19] metulburr likes this post Posts: 4 Threads: 1 Joined: Jun 2019 Reputation: 0 Likes received: 0 Jun142019, 05:03 PM (This post was last modified: Jun142019, 05:03 PM by calonia. Edited 1 time in total.) (Jun142019, 04:10 PM)ThomasL Wrote: @calonia Modifying a list whilst iterating over it is a very bad idea. The 2nd example from @metulburr is perfect as it keeps the order of the items in the original list. If that doesn´t matter his 1st example is faster. In addition your runtime is O(len(numbers)*len(numbers)) which is bad. numbers.count(x) runs over the full list and counts each number. Try to do this in O(len(numbers) which is possible. (not using above examples) :) thanks for the reply. i really appreciate your help. but i want to know what is wrong with this code. it doesn't seem to work with some of the numbers! Posts: 45 Threads: 0 Joined: Jun 2019 Reputation: 7 Likes received: 12 Posts: 4 Threads: 1 Joined: Jun 2019 Reputation: 0 Likes received: 0 (Jun142019, 05:13 PM)ThomasL Wrote: Have a read here thank you very much. that was so helpful. i now get it. modifying a list while iterating through it(adding or removing items) leads to skipping indexes. Posts: 580 Threads: 1 Joined: Jun 2018 Reputation: 48 Likes received: 112 Printing is 'cheapest' debugging tool. If one adds two print statements everything is quite selfexplanatory: >>> numbers = [3, 3, 20, 6, 10, 6, 5, 5, 7, 10, 7, 19, 19, 20]
>>> for x in numbers:
... print(f'x is {x}')
... if numbers.count(x) > 1:
... numbers.remove(x)
... print(numbers)
...
x is 3 # first element in numbers
[3, 20, 6, 10, 6, 5, 5, 7, 10, 7, 19, 19, 20]
x is 20 # second element in numbers
[3, 6, 10, 6, 5, 5, 7, 10, 7, 19, 19, 20]
x is 10 # third element in numbers
[3, 6, 6, 5, 5, 7, 10, 7, 19, 19, 20]
x is 5 # fourth element in numbers
[3, 6, 6, 5, 7, 10, 7, 19, 19, 20]
x is 7 # fifth element in numbers
[3, 6, 6, 5, 10, 7, 19, 19, 20]
x is 7 # sixth element in numbers
x is 19 # seventh element in numbers
[3, 6, 6, 5, 10, 7, 19, 20]
x is 20 # eight and last element in numbers
I'm not 'in'sane. Indeed, I am so far 'out' of sane that you appear a tiny blip on the distant coast of sanity. Bucky Katt, Get Fuzzy Posts: 4 Threads: 1 Joined: Jun 2019 Reputation: 0 Likes received: 0 (Jun142019, 08:41 PM)perfringo Wrote: Printing is 'cheapest' debugging tool. If one adds two print statements everything is quite selfexplanatory: >>> numbers = [3, 3, 20, 6, 10, 6, 5, 5, 7, 10, 7, 19, 19, 20]
>>> for x in numbers:
... print(f'x is {x}')
... if numbers.count(x) > 1:
... numbers.remove(x)
... print(numbers)
...
x is 3 # first element in numbers
[3, 20, 6, 10, 6, 5, 5, 7, 10, 7, 19, 19, 20]
x is 20 # second element in numbers
[3, 6, 10, 6, 5, 5, 7, 10, 7, 19, 19, 20]
x is 10 # third element in numbers
[3, 6, 6, 5, 5, 7, 10, 7, 19, 19, 20]
x is 5 # fourth element in numbers
[3, 6, 6, 5, 7, 10, 7, 19, 19, 20]
x is 7 # fifth element in numbers
[3, 6, 6, 5, 10, 7, 19, 19, 20]
x is 7 # sixth element in numbers
x is 19 # seventh element in numbers
[3, 6, 6, 5, 10, 7, 19, 20]
x is 20 # eight and last element in numbers
thanks, that further illustrates my problem. Posts: 4,129 Threads: 259 Joined: Sep 2016 Reputation: 109 Likes received: 1049 Jun142019, 09:13 PM (This post was last modified: Jun142019, 09:14 PM by metulburr. Edited 1 time in total.) (Jun142019, 06:50 PM)calonia Wrote: modifying a list while iterating through it(adding or removing items) leads to skipping indexes. You should know that you can loop over a copy of a list however The [:] returns a shallow copy of the list, in which this case doesnt matter because all of the elements are ints numbers = [3, 3, 20, 6, 10, 6, 5, 5, 7, 10, 7, 19, 19, 20]
for x in numbers[:]:
if numbers.count(x) > 1:
numbers.remove(x)
print(numbers) Output: [3, 6, 5, 10, 7, 19, 20]
