使用 Python3.5 中的解包概括合并 python3 中的两个 dic

Merging two dic in python3 using Unpacking Generalisations in Python3.5

下面有两个字典,我想合并它们,我的意思是select那些我感兴趣的键,例如我对除县以外的所有键都感兴趣。我使用的解决方案是在创建新词典后使用 del 函数,但是我确信还有更多方法可以更有效地解决我的解决方案。如何在没有 del 函数的情况下使用 UNPACKING ARGUMENT.

解决这个问题
    >>> 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'}

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

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 是您要忽略的 list/set/tuple 个键

How can I solve this problem without del function using UNPACKING ARGUMENT?

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

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} 的工作原理感到好奇的人。这是从 python 3.5+ 开始支持的新语法,在 PEP 448. Check: What's New in Python 3.5 文档中提出。

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

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

或不使用 ** 作为:

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

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

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

请注意 .pop returns 值也是如此(此处 "Japan")。