【问题标题】:How to create key or append an element to key?如何创建键或将元素附加到键?
【发布时间】:2012-10-06 00:56:43
【问题描述】:

我有一本空字典。姓名:dict_x 就是有键,值是列表。

从一个单独的迭代中,我获得了一个键(例如:key_123)和一个项目(一个元组)以放入 dict_x 的值 key_123 的列表中。

如果这个键已经存在,我想追加这个项目。 如果这个键不存在,我想用一个空列表创建它,然后附加到它,或者只是在其中创建一个元组。

将来当这个键再次出现时,因为它存在,我希望再次附加该值。

我的代码是这样的:

获取键和值。

查看dict_x中是否存在NOT键。

如果不创建它:dict_x[key] == []

之后:dict_x[key].append(value)

这是这样做的方法吗?我应该尝试使用try/except 块吗?

【问题讨论】:

    标签: python dictionary


    【解决方案1】:

    使用dict.setdefault():

    dict.setdefault(key,[]).append(value)
    

    帮助(dict.setdefault)

        setdefault(...)
            D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if k not in D
    

    【讨论】:

    • 我曾经通过dict_x[key] = [some_value] if not dict_x.has_key(key) else dict_x[key] + [some_value] 做到这一点,但这个答案提出了一个更好的方法。事实上,它以set() 作为参数并允许您使用add() 方法...
    【解决方案2】:

    您可以在collections 中使用defaultdict

    来自文档的示例:

    s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
    d = defaultdict(list)
    for k, v in s:
        d[k].append(v)
    

    【讨论】:

      【解决方案3】:

      您可以为此使用defaultdict

      from collections import defaultdict
      d = defaultdict(list)
      d['key'].append('mykey')
      

      这比setdefault 稍微高效一些,因为您最终不会创建最终不会使用的新列表。每次调用 setdefault 都会创建一个新列表,即使该项目已经存在于字典中。

      【讨论】:

        【解决方案4】:

        以下是执行此操作的各种方法,以便您比较外观并选择您喜欢的。我以我认为最“pythonic”的方式对它们进行了排序,并评论了乍一看可能并不明显的利弊:

        使用collections.defaultdict

        import collections
        dict_x = collections.defaultdict(list)
        
        ...
        
        dict_x[key].append(value)
        

        优点:可能是最好的性能。缺点:在 Python 2.4.x 中不可用。

        使用dict().setdefault()

        dict_x = {}
        
        ...
        
        dict_x.setdefault(key, []).append(value)
        

        缺点:未使用的list()s 创建效率低。

        使用try ... except

        dict_x = {}
        
        ...
        
        try:
            values = dict_x[key]
        except KeyError:
            values = dict_x[key] = []
        values.append(value)
        

        或者:

        try:
            dict_x[key].append(value)
        except KeyError:
            dict_x[key] = [value]
        

        【讨论】:

        • 您好,您为什么认为 .setdefault 会创建不必要的字典?
        • 我认为.setdefault() 不会创建不必要的字典。我认为.setdefault() 的第二个参数中创建了不必要的lists(即[]),如果key 已经存在,则永远不会使用它。我可以使用dict.setdefault()(为了有效的密钥散列),并使用一个变量来重用未使用的lists,但这会增加几行代码。
        • IIRC,在 Python 中,等式中的空列表在字节码级别被视为常量,但这需要字节码专家确认(或仅使用 disas 模块)。
        • 使用.setdefault 创建一个常规的dict,其中缺少键查找将导致KeyError,而collections.defaultdict(list) 创建一个dict,其中缺少键查找将插入一个空的@987654341 @-- 我认为你应该根据你想要的行为来选择
        • 我在自己的代码中尝试了类似于 collections.defaultdict 的东西,但它产生了意想不到的副作用。例如,考虑以下 IDLE 交换: >>> list_dict = defaultdict(list) >>> len(list_dict) 0 >>> len(list_dict[0]) 0 >>> len(list_dict) 1 当 Python 调用默认值它会在没有您主动设置的情况下将键添加到字典中,如果使用太多默认值,这将创建很多空列表。我将为字典推出自己的包装函数,效率低下但希望更可预测。
        【解决方案5】:
        dictionary['key'] = dictionary.get('key', []) + list_to_append
        

        【讨论】:

        • 您应该解释在某些例外情况下这样做的(非常小的)优势;只是代码,不清楚为什么需要额外的答案。
        • 嗨,这只是一个没有额外导入的替代方案。这显然可以通过 if 语句来完成。我只是建议使用 .get() 的强大功能而不是使用 dict[]。
        • 前两个答案提到了两种没有导入的不同方式(尽管不是dict.get)。
        猜你喜欢
        • 2021-06-27
        • 1970-01-01
        • 2019-02-25
        • 1970-01-01
        • 1970-01-01
        • 2017-03-25
        • 1970-01-01
        • 2019-06-29
        • 1970-01-01
        相关资源
        最近更新 更多