конвертировать список строк в уникальный строчный регистр, сохраняя порядок (python 2.7)

Я хотел бы преобразовать список строк в нижний регистр и удалить дубликаты при сохранении порядка. Много однострочной магии Python, которую я нашел в StackOverflow, преобразует список строк в нижний регистр, но кажется, что порядок утерян.

Я написал код, который действительно работает, и я счастлив придерживаться его. Но мне было интересно, есть ли способ сделать это, что намного больше pythonic и меньше кода (и, возможно, меньше ошибок, если я буду писать что-то подобное в будущем. Мне понадобилось некоторое время, чтобы написать).

def word_list_to_lower(words):
    """ takes a word list with a special order (e.g. frequency)
    returns a new word list all in lower case with no uniques but preserving order"""

    print("word_list_to_lower")    
    # save orders in a dict
    orders = dict()
    for i in range(len(words)):
        wl = words[i].lower()

        # save index of first occurence of the word (prioritizing top value)        
        if wl not in orders:
            orders[wl] = i

    # contains unique lower case words, but in wrong order
    words_unique = list(set(map(str.lower, words)))

    # reconstruct sparse list in correct order
    words_lower = [''] * len(words)
    for w in words_unique:
        i = orders[w]
        words_lower[i] = w

    # remove blank entries
    words_lower = [s for s in words_lower if s!='']

    return words_lower
0
источник поделиться
4 ответа

Небольшое изменение ответа. Как удалить дубликаты из списка в процессе сохранения заказа?

def f7(seq):
    seen = set()
    seen_add = seen.add
    seq = (x.lower() for x in seq)
    return [x for x in seq if not (x in seen or seen_add(x))]
+1
источник

Вы также можете сделать:

pip install orderedset

а потом:

from orderedset import OrderedSet
initial_list = ['ONE','one','TWO','two','THREE','three']
unique_list =  [x.lower() for x in list(OrderedSet(initial_list))]

print unique_list
+1
источник

Просто сделайте что-нибудь вроде:

initial_list = ['ONE','one','TWO','two']
uninique_list =  [x.lower() for x in list(set(initial_list))]

print unique_list
0
источник
initial_list = ['ONE','one','TWO','two']
new_list = []
[new_list.append(s.lower()) for s in initial_list if s.lower() not in new_list]
0
источник

Посмотрите другие вопросы по меткам или Задайте вопрос