使用 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")。
下面有两个字典,我想合并它们,我的意思是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']
没有直接的方式满足您的条件:
- 使用参数解包 创建新的
- 未使用
del
删除国家/地区。
dict
但如果这是您想要的,也有变通办法。例如使用 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")。