【问题标题】:Creating a dict of blank lists that are not the same list [duplicate]创建不同列表的空白列表的字典[重复]
【发布时间】:2013-12-21 04:38:05
【问题描述】:

我正在尝试创建一个可以附加到 for 循环中的列表字典。但是,如果我使用fromkeys 创建一个字典,则该列表将成为“指针”的副本,而不是新列表。例如,

newdict = dict.fromkeys(range(10), [])

-- 或--

newdict = dict.fromkeys(range(10), list())

两者都产生相同的数据结构,即具有相同列表作为值对的字典。这样当任何密钥被更新时,例如- newdict[0].append(100)print newdict对应的输出为:

{0: [100], 1: [100], 2: [100], 3: [100], 4: [100], 5: [100], 6: [100], 7: [100], 8: [100], 9: [100]}

关于如何避免这种情况而不必在 for 循环中迭代的任何想法?提前致谢。

【问题讨论】:

  • 次要:你的意思是newdict[0].append(100),或者newdict[0] += [100],而不是newdict[0] = 100
  • 我在 3.3.3 中没有出现这种行为:newdict[0]=100 产生 {0: 100, 1: [], 2: [], 3: [], 4: [], 5: [], 6: [], 7: [], 8: [], 9: []}...
  • @DSM - 是的,谢谢我更正了。

标签: python list dictionary copy


【解决方案1】:

两种最常见的方法是使用字典推导:

>>> d = {k: [] for k in range(10)}
>>> d[3].append(100)
>>> d
{0: [], 1: [], 2: [], 3: [100], 4: [], 5: [], 6: [], 7: [], 8: [], 9: []}

或者使用defaultdict 并完全放弃设置任何键:

>>> from collections import defaultdict
>>> d = defaultdict(list)
>>> d
defaultdict(<type 'list'>, {})
>>> d[9].append(100)
>>> d
defaultdict(<type 'list'>, {9: [100]})

作为第三个选项,使用setdefault -- 例如d.setdefault(k, []) 而不是d[k],就像在defaultdict 的情况下,你可以避免需要预设[]

>>> d = {}
>>> d.setdefault(3, []).append(100)
>>> d
{3: [100]}

【讨论】:

    【解决方案2】:

    也许是听写理解?

    newdict = {x: [] for x in range(10)}
    

    【讨论】:

    • 他不想使用 for 循环
    • @thefourtheye 我不确定我是否会将理解视为循环。
    • 如果问题中的without having to iterate through in a for loop 意味着什么......
    • 我也不认为 dict 理解与 for 循环相同。感谢您的回答。
    【解决方案3】:

    我想你想做

    newdict[0].append(100)
    

    对吗?

    【讨论】:

      【解决方案4】:

      fromkeysdict 类的静态方法。默认行为旨在将一组字典键设置为 single 值,例如设置多组计数器:

      >>> d={}.fromkeys('abc',0)
      >>> d
      {'a': 0, 'c': 0, 'b': 0}
      >>> d['a']+=1
      >>> d
      {'a': 1, 'c': 0, 'b': 0}
      

      可以修补它来为每个元素调用一个函数:

      >>> class FixFromKeys(dict):
      ...     def fromkeys(cls, seq, func):
      ...         return {key:func() for key in seq}
      ... 
      >>> d=FixFromKeys().fromkeys([1,2,3],list)
      >>> d[1].append(1)
      >>> d
      {1: [1], 2: [], 3: []}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-07
        • 2019-04-11
        • 2020-02-26
        • 1970-01-01
        • 2019-09-25
        • 1970-01-01
        相关资源
        最近更新 更多