【问题标题】:Merging dictionaries using a counter使用计数器合并字典
【发布时间】:2011-04-24 20:59:25
【问题描述】:

我有以下词典(示例):

>>> x = {'a': 'foo', 'b': 'foobar'}
>>> y = {'c': 'barfoo', 'd': 'bar'}

我想取每个的keys 并使它们成为另一个dict 的值,比如z,这样zkeys 是一个递增的计数器,等于两者的长度dicts

>>> z = {1: 'a', 2: 'b', 3: 'c', 4: 'd'}

如您所见,zkeys 是递增计数器,valuesxykeys

我如何实现这一目标?我尝试了各种解决方案并使用zip,但似乎没有一个有效。可能是因为我必须连续更新z dict。

有什么建议吗?

【问题讨论】:

    标签: python dictionary merge


    【解决方案1】:
    In [1]: import itertools
    In [2]: x = {'a': 'foo', 'b': 'foobar'}
    In [3]: y = {'c': 'barfoo', 'd': 'bar'}
    
    In [4]: z = [key for key in itertools.chain(x, y)]
    
    In [5]: z
    Out[5]: ['a', 'b', 'c', 'd']
    
    In [6]: dict(enumerate(z))
    Out[6]: {0: 'a', 1: 'b', 2: 'c', 3: 'd'}
    
    In [7]: dict(enumerate(z, 1))
    Out[7]: {1: 'a', 2: 'b', 3: 'c', 4: 'd'}
    

    如果您希望重复键只出现一次,请将[4] 替换为:

    z = set(key for key in itertools.chain(x, y))
    

    请注意,您也可以一次完成所有操作(在此示例中,我已将 'a': 'meow' 添加到 y):

    In [15]: dict(enumerate(set(key for key in itertools.chain(x, y)), 1))
    Out[15]: {1: 'a', 2: 'c', 3: 'b', 4: 'd'}
    
    In [16]: dict(enumerate((key for key in itertools.chain(x, y)), 1))
    Out[16]: {1: 'a', 2: 'b', 3: 'a', 4: 'c', 5: 'd'}
    

    【讨论】:

    • +1,漂亮!一个非常优雅的解决方案。我从没想过dict(enumerate) 部分。
    • 现在更优雅了;)
    【解决方案2】:
    import itertools as it
    {i+1:k for i,k in enumerate(it.chain(x,y))}
    # {1: 'a', 2: 'b', 3: 'c', 4: 'd'}
    

    请注意,dict-(和相关的 set-)推导是 v2.7+ 中的新功能。

    【讨论】:

    • 很好,我不知何故完全忽略了chain 部分。
    • 请注意,dict 理解需要 python 2.7 - 在较旧的 python 版本中,您需要 dict((i+1, k) for ...) 而不是 {i+1:k for ...}
    猜你喜欢
    • 2014-09-23
    • 2015-09-18
    • 2015-04-08
    • 1970-01-01
    • 1970-01-01
    • 2010-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多