使用python3.5中的解包泛化合并python3中的两个dic

2024-09-24 22:28:48 发布

您现在位置:Python中文网/ 问答频道 /正文

下面有两个字典,我想合并它们,我的重点是选择那些我感兴趣的键,例如我感兴趣的所有键除了县。我使用的解决方案是在创建新词典之后使用del函数,但是我确信有更多的方法可以更有效地解决这个问题。如何在没有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'}

Tags: 函数重点字典items解决方案country感兴趣d2
3条回答

为什么要用参数解包呢? 只要做:

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

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

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

注意.pop也返回值(这里是“Japan”)。你知道吗

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}如何工作的古玩。它是从python3.5+开始支持的新语法,在PEP 448中提出。检查:What's New in Python 3.5文档。你知道吗

由于只有python3.5+支持{**dict1, **dict2},因此对于早期版本的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'}

相关问题 更多 >