使用Python3.5中的Unpacking Generalizations合并python3中的两个dic

时间:2016-10-05 13:17:23

标签: python python-3.5 argument-unpacking

我想要合并它们有​​两个词典,我的意思是选择我感兴趣的那些键,例如我对除了郡以外的所有键感兴趣。我在创建新词典后使用del函数的解决方案,但我确信有更多方法可以提高我的解决方案效率。如何使用 UNPACKING ARGUMENT 在没有del功能的情况下解决此问题。

    >>> d1 =  {'avgUserperDay': '12', 'avgPurchaseperDay': '1', 'country': 'Japan'}
    >>> d2 = {'tUser': 1, 'tPurchase': 0, 'country': 'Japan'}
    >>> d ={**d1,**d2}
    >>>{'tUser': 1, 'tPurchase': 0, 'avgPurchaseperDay': '1', 'avgUserperDay': '12', 'country': 'Japan'}
    >>> del d['country']
    >>> d
    {'tUser': 1, 'tPurchase': 0, 'avgPurchaseperDay': '1', 'avgUserperDay': '12'}

讨论后,

此命令适用于3.5.1,

>>> {**{k:v for k, v in chain(d1.items(), d2.items()) if k != 'country'}}
{'tUser': 1, 'tPurchase': 0, 'avgPurchaseperDay': '1', 'avgUserperDay': '12'}

3 个答案:

答案 0 :(得分:1)

为什么要使用参数解包来做? 只是做:

from itertools import chain
d = {key:value for key, value in chain(d1.iteritems(), d2.iteritems())
     if key not in keys_to_ignore}

其中keys_to_ignore是您要忽略的键的列表/设置/元组

答案 1 :(得分:1)

  

如果没有使用UNPACKING ARGUMENT的del函数,我该如何解决这个问题?

是的,你可以。但你不应该。理想的方式应该是:

d1.update(d2)   # values will be updated in d1 dict
del d1['country']

没有直接的方法来满足你的条件:

  • 使用参数解包
  • 创建新的dict
  • 未使用del删除国家/地区。

但如果这是你想要的,那么就可以解决这个问题。例如,将itertools.chain() dict comprehension 一起使用为

{**{k:v for k, v in chain(d1.items(), d2.items()) if k != 'country'}}

注意:关于{**dict1, **dict2}如何运作的好奇心。它是从PEP 448中提出的python 3.5+以来支持的新语法。检查:What's New in Python 3.5文档。

因为 {**dict1, **dict2}仅在Python 3.5 + 中受支持,对于早期版本的Python,您可以这样做(如S. De Melo所述):

d = dict(d1, **d2)
d.pop("country")

或不使用**作为:

{k, v for k, v in chain(d1.iteritems(), d2.iteritems()) if k != 'country'}

答案 2 :(得分:1)

如果您不想使用del,可以将其替换为.pop(key)。 例如,也使用解包参数:

d = dict(d1, **d2)
d.pop("country")

请注意,.pop也会返回该值(此处为“Japan”)。