Как удалить один из дубликатов ключей (один в нижнем регистре, один в верхнем) и объединить их значения в Python? - PullRequest
0 голосов
/ 25 июня 2019

У меня есть список словарей с именем dicts. Я пишу dicts в CSV-файл, используя DictWriter. dicts имеет дубликаты ключей, такие как: Accepted Currencies (DASH) и Accepted Currencies (Dash), которые я хотел бы объединить эти ключи в один ключ с заглавной буквы, т.е. я хочу сохранить только Accepted Currencies (DASH) как ключ и сохранить значение этого удаленного ключа как Что ж; в этом случае сохраните значение Accepted Currencies (Dash). Например, в настоящее время мои диктанты содержат следующее:

dicts = [{'Accepted Currencies (DASH)': 'DASH'}, {'Accepted Currencies (Dash)': 'Dash'}]

Но я хочу что-то вроде следующего:

dicts = [{'Accepted Currencies (DASH)' : 'DASH'}, {'Accepted Currencies (DASH)': 'Dash'}]

Вот мой код:

dicts = []
    for j in range(1,39):
        for i in range(1,10):


###Some code here to calculate super_dict

            super_dict.update(social_urls)

            super_dict.update(metadata)
            super_dict.update(project_name)
            super_dict.update(bc_dict)
            super_dict.update(ind_dict)
            super_dict.update(pos_dict)
            super_dict.update(likes_dict)
            super_dict.update(memprof_dict)
            super_dict.update(video_link)
            super_dict.update(details_dict)
            dicts.append(super_dict)            

Ответы [ 2 ]

3 голосов
/ 25 июня 2019

По сути, у вас есть противоречивые названия в словарных ключах, поэтому вы хотите, чтобы они следовали тем же правилам. Часто называют нормализацию: https://en.wikipedia.org/wiki/Normalization

Самое простое правило, которое нужно реализовать, это просто "сделать их все строчными", хотя вы могли бы написать свои собственные правила, например, "начальная буква для всех слов, кроме всех заглавных букв в скобках". Я просто предоставляю здесь все строчные буквы.

# define a function that makes all key names follow the same guidelines (normalization)
def normalize_keyname(key):
    return key.lower()

before = [
    {'Accepted Currencies (DASH)': 'DASH'}, 
    {'Accepted Currencies (Dash)': 'Dash'}
]

after = [
    {normalize_keyname(key): value for key, value in entry.items()} 
    for entry in before
]

for entry in after:
    print(entry)

{'принятые валюты (тире)': 'DASH'}
{'принятые валюты (тире)': 'тире'}

Я сосредоточился на технике придания им последовательных ключевых имен. Вы можете улучшить читабельность, изменив детали реализации в функции normalize_keyname, но я бы хотел оставить эту часть для вас. Хотя сделать его красивым - не проблема для данных - вы всегда можете обработать это в форматере, когда отображаете его.

0 голосов
/ 26 июня 2019
def normalize_keyname(key):
    if ' (' in key:
        ixx = key.find(' (')
        tmp = key[ixx:].upper()
        cap_key = key[:ixx]+tmp


    else:
        cap_key = " ".join(w.capitalize() for w in key.split())
    return cap_key

before = [
    {'Accepted Currencies (DASH)': 'DASH'}, 
    {'Accepted Currencies (Dash)': 'Dash'}
]

after = [
    {normalize_keyname(key): value for key, value in entry.items()} 
    for entry in before
]

for entry in after:
    print(entry)
...