【问题标题】:Python append to return dict instead of a listPython追加返回字典而不是列表
【发布时间】:2019-08-26 20:29:23
【问题描述】:

下面的追加是有效的,但它返回一个列表而不是一个字典。因此,当我尝试使用 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

【问题讨论】:

    标签: python python-3.x list dictionary


    【解决方案1】:

    不要把它变成dicts 中的list,首先要制作一个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():
        ...
    

    【讨论】:

    • +1 我们的思维过程非常相似 :) 或者更确切地说,Python 足够优雅,可以有一些明确的做事方式:)
    【解决方案2】:

    这是因为 tag.items() 返回一个 dict_items 实例(一个对象不是元组)。您感到困惑的原因是,当您对其执行 foreach 时,您可以将它们提取为元组,但原因是因为 dict_item 是一个可迭代对象,每次迭代都会产生元组。

    您可能想要附加一个元组,而不是 all_tags.append({tag_key: tag_value}),而不是 all_tags.append((tag_key, tag_value))

    【讨论】:

    • 这可行,但它正在返回一个列表。即“列表”对象没有属性“项目”
    • @munchine,这就是重点,它不再是一个字典,你不需要打电话给items()
    【解决方案3】:

    把函数改成这样怎么样:

    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)}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-01
      • 1970-01-01
      • 2010-12-27
      • 1970-01-01
      • 2018-03-01
      • 1970-01-01
      • 2021-09-26
      相关资源
      最近更新 更多