【问题标题】:Adding Items to Python Dictionary将项目添加到 Python 字典
【发布时间】:2014-01-15 15:22:59
【问题描述】:

我可能理解错了,但是查看 O'Reilly 在“Learning Python”中找到的示例,我尝试执行以下操作:

>>> d={}
>>> d['h']='GG'
>>> d['f']='JJ'
>>> d['h']='PP'
>>> print d
{'h': 'PP', 'f': 'JJ'}

现在,“键”'h' 不再有两个条目 'GG''PP',它只有最后一个条目,最后一个替换第一个。 我希望两者都在同一个键中。

>>> d['h']+='RR'
>>> print d
{'h': 'PPRR', 'f': 'JJ'}

同样这不起作用,我想要的不是连接字符串,而是逗号分隔的整体。

我很困惑为什么这不起作用。

【问题讨论】:

  • 我不是在攻击,而是出于真正的好奇而询问 - 为什么您认为 d['h']='PP' 会根据已经存在的值创建一个列表并将新值附加到列表中?我想了解该语言的新手如何预测该语言的工作方式。
  • 没关系,我会解释的。我的python“圣经”是Mark Lutz和David Ascher的Learning python。我大量使用这本书,它的第 49-51 页确实给我这样的印象,即您可以将项目添加到现有的键中。我确信他们不打算这样做,但是我对那几页的多次阅读给了我这种印象,尤其是示例。我希望他们在下一版中包含像我的问题这样的示例。

标签: python dictionary add


【解决方案1】:

collections.defaultdict() 类型可以很好地处理您的用例:

>>> from collections import defaultdict
>>> d = defaultdict(list)
>>> d['h'].append('GG')
>>> d['f'].append('JJ')
>>> d['h'].append('PP')
>>> d
defaultdict(<type 'list'>, {'h': ['GG', 'PP'], 'f': ['JJ']})

regular 字典将 one 键映射到 one 值,如果您希望该值成为列表,则应将其设为列表,然后追加到列表中。

您没有使用defaultdict() 对象,您始终可以将您的值设为显式列表:

>>> d = {}
>>> d['h'] = ['GG']
>>> d['f'] = ['JJ']
>>> d['h'].append('PP')
>>> print d
{'h': ['GG', 'PP'], 'f': ['JJ']}

但现在您需要明确地创建列表。然后可以使用dict.setdefault() 再次规避后一个问题:

>>> d = {}
>>> d.setdefault('h', []).append('GG')
>>> d.setdefault('f', []).append('JJ')
>>> d.setdefault('h', []).append('PP')

这只是使用 defaultdict() 对象可以直接提供的更详细的方式。

【讨论】:

    【解决方案2】:

    听起来您希望您的字典将'h' 映射到字符串的列表,您可以执行以下操作:

    >>> d={}
    >>> d['f']='JJ'
    >>> d['h']=['PP']
    >>> d['h'].append( 'RR' )
    >>> d
    {'h': ['PP', 'RR'], 'f': 'JJ'}
    

    如果您希望字典的所有键都映射到一个列表(而不仅仅是'h'),您可以使用collection.defaultdict,如@MartijnPieters 的回答所示。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-22
      • 2020-05-29
      • 1970-01-01
      • 1970-01-01
      • 2021-11-27
      • 1970-01-01
      相关资源
      最近更新 更多