Python добавляет, чтобы вернуть dict вместо списка - PullRequest
1 голос
/ 05 апреля 2019

Приложение ниже работает, но оно возвращает список, а не dict. Поэтому, когда я попытался извлечь ключ / значение с помощью tag.items (), он сказал мне, что есть

ValueError: недостаточно значений для распаковки (ожидайте 2, получили 1)

Это правильное сообщение об ошибке, так как это список, поскольку all_tags.append создает список. Как мне вернуть его как диктовку?

tags = get_all_tags(client_tags)

for tag in tags:
    tag_key, tag_value = tag.items()

...

def get_all_tags(client_tags):

    for tag_key, tag_value in client_tags.items():
        if re.match(TAG_KEY_PATTERN, tag_key):
           all_tags.append({tag_key: tag_value})

    return all_tags

Ответы [ 3 ]

3 голосов
/ 05 апреля 2019

Не начинайте с list из dict с, просто наберите dict во-первых:

def get_all_tags(client_tags):
    all_tags = {}
    for tag_key, tag_value in client_tags.items():
        if re.match(TAG_KEY_PATTERN, tag_key):
           all_tags[tag_key] = tag_value

    return all_tags

Или как однострочник, используя dict понимание:

def get_all_tags(client_tags):
    return {k: v for k, v in client_tags.items() if re.match(TAG_KEY_PATTERN, k)}

В любом случае, ваш цикл для его использования будет:

for tag_key, tag_value in tags.items():
    ...
0 голосов
/ 05 апреля 2019

Как насчет изменения функции на это:

def get_all_tags(client_tags):
    all_tags = {}
    for tag_key, tag_value in client_tags.items():
       if re.match(TAG_KEY_PATTERN, tag_key):
           all_tags[tag_key] = tag_value

    return all_tags

Вы даже можете понять словарь:

def get_all_tags(client_tags):
    return {tag_key: tag_value for tag_key, tag_value in client_tags if re.match(TAG_KEY_PATTERN, tag_key)}
0 голосов
/ 05 апреля 2019

Это потому, что tag.items() возвращает экземпляр dict_items (один объект не кортеж).Причина, по которой вы сбиты с толку, заключается в том, что когда вы выполняете foreach над ним, вы можете извлекать их как кортежи, но причина в том, что dict_item является итерацией, которая выдает кортежи для каждой итерации.

Вместо all_tags.append({tag_key: tag_value}) вы можете добавить кортеж как all_tags.append((tag_key, tag_value)).

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