-1

下面有两个字典我想合并它们,我的意思是选择那些我感兴趣的键,例如我对除县以外的所有键感兴趣。我使用的解决方案是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'}
4

3 回答 3

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 是您要忽略的键的列表/设置/元组

于 2016-10-05T13:29:31.110 回答
1

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

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

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

没有直接的方法可以满足您的条件:

  • dict使用参数解包创建新的
  • del用于删除国家。

但是,如果这是您想要的,则可以解决。例如使用itertools.chain()dict理解为:

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

注意:对于那些关于{**dict1, **dict2}偶数如何工作的古玩。这是自 Python 3.5+ 以来支持的新语法,在PEP 448中提出。检查:Python 3.5文档中的新增功能。

由于,{**dict1, **dict2}仅在 Python 3.5+ 中受支持,因此对于早期版本的 Python,您可以执行以下操作(如 S. De Melo所述):

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

或不使用**as:

{k, v for k, v in chain(d1.iteritems(), d2.iteritems()) if k != 'country'}
于 2016-10-05T13:31:01.310 回答
1

如果不想使用del,可以用.pop(key). 例如,也使用 unpacking 参数:

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

请注意,它也.pop返回值(此处为“日本”)。

于 2016-10-05T13:34:08.420 回答