Присоединение к словарям при изменении значений в python - PullRequest
1 голос
/ 12 апреля 2020

У меня есть словарь типа d1={"url1":0, "url2":1, ...}. Затем у меня есть еще два словаря в том же формате, которые содержат разные URL-адреса, но значения по-прежнему начинаются с 0. Есть ли способ объединить словари так, чтобы числа автоматически менялись, и у меня есть словарь, в котором нет повторяющихся значений (ie каждый URL имеет уникальный номер после добавления). Я пытался .update(), но я не думаю, что это работает для моей цели.

С точки зрения добавления более ясного примера, код выглядит примерно так:

d1 = {"url1":0, "url2":1}
d2 = {"url3":0, "url4":1}
d3 = {"url5":0, "url6":1}

Я хочу функция, которая объединит эти словари и выдаст мне:

d4 = {"url1":0, "url2":1, "url3":2, "url4":3, "url5":4, "url6":5}

Я попробовал d1.update(d2), а затем d1.update(d3), но они, похоже, не сработали.

Ответы [ 3 ]

1 голос
/ 12 апреля 2020

Попробуйте это:

def append_di(d_to, d_from):
    start = len(d_to)
    for k in d_from:
        if k not in d_to: 
           d_to[k] = start
           start += 1

di = {"url1":0, "url2":1}
di_2 = {"url3":0, "url4":1, "url1":2}
append_di(di, di_2)
print(di)

Выходы:

{'url1': 0, 'url2': 1, 'url3': 2, 'url4': 3}

Использование понимания слова :

di = {"url1":0, "url2":1}
di_2 = {"url3":0, "url4":1, "url1":3}
di.update({k:(len(di) + i) for i,k in enumerate(di_2) if k not in di})
print(di)
0 голосов
/ 12 апреля 2020

Предполагается, что вы используете версию Python, которая поддерживает порядок вставки для диктов И вы просто хотите, чтобы значения начинались с нуля и увеличивались на единицу для каждой клавиши:

d1 = {"url1":0, "url2":1}
d2 = {"url3":0, "url4":1}
d3 = {"url5":0, "url6":1, 'url1':2}

new = dict.fromkeys(k for d in [d1,d2,d3] for k in d.keys())
for i,k in enumerate(new):
    new[k] = i

k for d in [d1,d2,d3] for k in d.keys() выравнивает последовательность ключей из каждого диктанта.
Создание нового словаря с использованием fromkeys() устраняет дубликаты.


>>> new
{'url1': 0, 'url2': 1, 'url3': 2, 'url4': 3, 'url5': 4, 'url6': 5}
>>> 
0 голосов
/ 12 апреля 2020

Я не уверен, что мне понятны нюансы функциональности, которую вы ищете, но это может удовлетворить ваши потребности:

dicts = [d1,d2,d3]
keys = [k for d in dicts for k in d.keys()]
d4 = dict(zip(keys, range(len(keys))))

Обратите внимание, что он ничего не делает для заказа ключей. Кроме того, если присутствуют избыточные ключи, первый предоставленный ключ будет перезаписан последующими ключами. Это приведет к пробелам в схеме индексации.

Это решение довольно простое, но если вам нужна более высокая степень контроля, я предлагаю использовать al oop, например, предложенный @ abhiarora.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...