Python функция для добавления списка к ключу в словаре - PullRequest
0 голосов
/ 01 марта 2020

У меня есть словарь с ключами. Соответствующим значением ключа может быть список / словарь / строка.

Если это список, цель состоит в том, чтобы: добавить другой список (который будет получен из другого ключа словаря) в существующий список с key.

Если это строка / dict, цель: перезаписать новую строку / словарь на нем.

Любой совет, как этого добиться?

РЕДАКТИРОВАТЬ:

Извините, что не предоставил пример.

Предположим, у меня есть словарь A как

{
  "names" :  ["John","Tyler","Peter"],
  "Institution" :{
                   "name" : "St. John's Business School",
                   "address" : "34 Janson Drive"
                  }
}

и B как

{
 "names" : ["Alice","Joanna"],
 "class" :  "Economics",
 "Institution" : {
                   "name" : "St. Mary's Republic",
                   "address" : "88, Weston Road"
                  }
}

Теперь я хочу добиться:

Я буду перебирать B,

, если ключ отсутствует в A (например, «класс»), я добавлю его в A.

, если он присутствует, и его значение является строкой / dict, я заменю значение в A значением в B (как это было сделано с "Institution")

Если это настоящее и его значение является списком, я добавлю список в B к списку в A. (как сделано в «именах»)

Так что после выполнения моей функции окончательный словарь будет выглядеть следующим образом:

{
  "names" : ["John","Tyler","Peter","Alice","Joanna"]
  "class" : "Economics",
  "Institution" : {
                       "name" : "St. Mary's Republic",
                       "address" : "88, Weston Road"
                      }
}

Мне удалось получить правильное условие string / dict. Но я не могу добавить в существующий список.

Есть предложения? Заранее спасибо

Ответы [ 4 ]

1 голос
/ 01 марта 2020
def update_dict(current_dict: dict, key: str, value: object) -> None:
    """
    Update existing dictionary with the following rules:
        - If the corresponding value of the key is a list; then append the value
        - If the corresponding value of the key is a string or dict; then overwrite the old value
    :param current_dict: current dictionary (e.q dictionary with keys)
    :param key: the key you want to process
    :param value: the value you want to add tot the specific key
    :return: None
    """
    if key not in current_dict:
        current_dict[key] = value # If the key doesn't exist, add it. However, you can raise a Exception if you want

    elif type(value) not in [str, list, dict]:
        raise ValueError("Invalid value type \"{val_type}\"".format(val_type=type(value)))

    elif isinstance(value, list):
        current_dict[key].append(value)

    else:
        current_dict[key] = value

if __name__ == '__main__':
    d = {"a": "", "b": [1, 2], "c": {"x": 1, "y": 2, "z": 3}}
    update_dict(d, 'a', 'New string')
    update_dict(d, 'b', ['a', 'b'])
    update_dict(d, 'c', "This was a dictionary")

    print(d)

ВЫХОД

{'a': 'New string', 'b': [1, 2, ['a', 'b']], 'c': 'This was a dictionary'}
1 голос
/ 01 марта 2020

Есть ли какой-нибудь код, который вы могли бы показать нам, чтобы увидеть, что именно нужно?

Если это просто добавление списка в качестве значения к существующему или новому ключу в dict, это может сработать:

myDict["movies"].append(['Jurassic Park 4'])

Это может сработать, но, опять же, есть ли что-то, что c вы пытаетесь выполнить sh с пониманием слов / списка.

0 голосов
/ 01 марта 2020

Я надеюсь, что получу то, что вы хотите. Вы можете использовать, если еще

data = {'a','b','c'}
another_list = {'b','d','e'}

if type(data) is list: 
    data.append(another_list)
elif type(data) is dict:
    data.append(overwrite_the_new_string
else: 
    print("your object is not a list/dict") 
0 голосов
/ 01 марта 2020

во время итерации по словарю вы можете использовать функции isinstance и type, чтобы проверить, является ли он списком, словарем или строкой, а затем выполнять свои операции в зависимости от их типа.

Пример кода

 d = {'a':[1,2,3], 'b':{'k1': 'v1', 'k2':'v2'}, 'c':'string1'}

l2 = [4,5,6]
d2 = {'k3':'v3', 'k4':'v4'}
c2 = 'string2'
for i in d:
    if type(d[i]) is list:
        d[i].append(l2)
    elif type(d[i]) is dict:
        d[i] = d2
    elif type(d[i]) is str:
        d[i] = c2
    else:
        pass
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...