[Tutor] Duplicate items in list

Mark Lawrence breamoreboy at gmail.com
Fri Oct 9 12:57:29 EDT 2020


On 09/10/2020 17:16, Mats Wichmann wrote:
> On 10/9/20 9:37 AM, Manprit Singh wrote:
>> Dear sir,
>>
>> Consider a list as given below :
>>
>> lst = [3, 3, 5, 5, 5, 6, 6, 6, 5, 9, 3, 3, 3, 5, 5]
>> I need to print the values  as given below  and in same order:
>>
>> 3       # print 3 only once as there are two occurrence of 3 in the
>> beginning  in list
>> 5       # print 5 only once as there are 3 occurrence of 5 after 3 in the
>> list
>> 6       # print 6 only once as there are 3 occurrence of 6 after 5 in the
>> list
>> 5       # print 5 only once as there is single occurrence of 5 after 6 in
>> the list
>> 9       # print 9 only once as there is single occurrence of 9 after 5 in
>> the list
>> 3       # print 3 only once as there  are 3 occurrence of 3 after 9 in the
>> list
>> 5       # print 5 only once as there are 2 occurrence of 5 in the last
>>
>> I have written the code as given below:
>> lst = [3, 3, 5, 5, 5, 6, 6, 6, 5, 9, 3, 3, 3, 5, 5]
>> for i, j in enumerate(lst[:-1]):
>>      if lst[i+1] != j:
>>          print(j)
>> print(lst[-1])
>>
>> which gives the answer as given above
>> I feel that a better code can be written for this problem , Need your
>> guidance.
> 
> Turns out there are a ton of ways to get the unique values from a list.
>   The problem comes up often, usually in the context of "what is the
> fastest way...".  The answer depends on whether you need to preserve the
> order or not, and what degree of cleverness feels comfortable in your code.
> 
>   If order doesn't matter, using a set will give you unique
> 
> uniques = set(lst)
> # and to print:
> print(*uniques)
> 
> If order does matter - as you have indicated it does, it is now possible
> to do with with a dictionary operation. This wins for speed, but isn't
> necessarily the "most obvious":
> 
> uniques = list(dict.fromkeys(lst))
> 
> dict.fromkeys constructs (using dict's alternate constructor) a
> dictionary given a list of keys (the values will all be None).  When you
> then convert the dictionary to a list, that is implicitly like doing
> list(d.keys()), but you don't have to specify the keys(). Since
> dictionary keys by definition must be unique, this uniquifies.
> 
> Other options exist, as noted...
> 
> One is to use a set, but only as a tracking devices:
> 
> seen = set()
> uniques = [x for x in lst if x not in seen and not seen.add(x)]
> 

That doesn't work, but if it makes you feel any better I fell for it as 
well from the subject line :)  Check the OP's output and 3 appears 
twice, 5 three times.  Unless there's a one liner using the itertools 
module, which I'm too lazy to try out right now, I'd say that you might 
as well stick with his original loop.

-- 
My fellow Pythonistas, ask not what our language can do for you, ask
what you can do for our language.

Mark Lawrence



More information about the Tutor mailing list