Unique list elements in Python, but prefer capitalized values

Viewed 63

If elements are added to an array (or set, dictionary), how can it result in unique elements (which set does case-sensitively) but prefer capitalized words instead of their lower-case alternatives (e.g. Apple instead of apple).

Example:

items = []

items.append('apple')
items.append('orange')
items.append('Apple')
items.append('grapes')
items.append('Orange')

Expected result:

[ 'Apple', 'Orange', 'grapes' ]

It'll be good to keep the original order by first occurrence (as in the result above).

I don't want to use any 3rd-party packages for this.

2 Answers

You have to use set, capitalize and lower:

unique_items = [i for i in list(set([i.lower() for i in items]))]

for i, unique_item in enumerate(unique_items):
     if unique_item.capitalize() in items:
         unique_items[i] = unique_item.capitalize()

unique_items.sort(key=lambda e: items.index(e.casefold()))

print(unique_items) # ['grapes', 'Apple', 'Orange']

I figured a simpler approach using a dictionary:

dict = {}

for i in items:
  il = i.lower()
  if not il in dict or i[0].isupper():
    dict[il] = i

print(list(dict.values()))
Related