通过附加值来组合dictonaries

时间:2015-08-22 09:56:58

标签: python dictionary

我刚开始学习python并坚持使用词典。

我编写了以下示例程序来合并两个词典:

dict4 = {}
dict1 = {'name' : 'Alice', 'Age' : '12'}
dict2 = {'name' : 'Apple', 'Age' : '13', 'Sex' : 'M'}
dict4 = dict.copy(dict1)

for i in dict2:
    if i not in dict4:
        dict4[i] = dict2[i]
    else:
        list(dict4[i]).append(dict2[i])

预期产出

dict4 = {'name' : ['Alice', 'Apple'], 'Age' : ['12', '13'], 'Sex' : ['', 'M']}

但我看到了 dict4

{'name': 'Apple', 'Sex': 'M', 'Age': 13}

3 个答案:

答案 0 :(得分:2)

只需创建列表,就像这样

for key in dict2:
    dict4[key] = [dict1.get(key, ''), dict2.get(key, '')]

注意我们使用dict2.get,如果找不到当前密钥,则接受默认值。

如果你想确保你想要两个词典中的所有键,请从这两个词典中创建一组键

>>> result = {}
>>> for key in (dict1.keys() | dict2):
...     result[key] = [dict1.get(key, ''), dict2.get(key, '')]
...
>>> result
{'name': ['Alice', 'Apple'], 'Sex': ['', 'M'], 'Age': ['12', '13']}

你仍然可以通过使用字典理解来完成这个,就像这样

>>> {k: [dict1.get(k, ''), dict2.get(k, '')] for k in (dict1.keys() | dict2)}
{'name': ['Alice', 'Apple'], 'Sex': ['', 'M'], 'Age': ['12', '13']}

如果您想使用任意数量的词典使其成为通用词,您可以使用以下

>>> from itertools import chain
>>> dicts = (dict1, dict2)
>>> result = {}
>>> for key in set(chain.from_iterable(dicts)):
...     result[key] = []
...     for d in dicts:
...         result[key].append(d.get(key, ''))
...         
>>> result
{'name': ['Alice', 'Apple'], 'Sex': ['', 'M'], 'Age': ['12', '13']}

答案 1 :(得分:0)

这是因为这一行:

list(dict4[i]).append(dict2[i])

根本不会修改dict4

这一行

 dict4[i] = dict2[i]

简单地用dict2&#39覆盖dict1的值。它不会给你一个清单。

他们都没有做你想要的。

要达到预期效果,请尝试以下操作:

result = {}

for key, value in dict1.items():
    result.setdefault(key, []).append(value)

for key, value in dict2.items():
    result.setdefault(key, []).append(value)

作为简化,你可以这样做

result = {}

for key, value in dict1.items() + dict2.items():
    result.setdefault(key, []).append(value)

答案 2 :(得分:0)

import os, winshell
from win32com.client import Dispatch

desktop = winshell.desktop()
path = os.path.join(desktop, "Media Player Classic.lnk")
target = r"P:\Media\Media Player Classic\mplayerc.exe"
wDir = r"P:\Media\Media Player Classic"
icon = r"P:\Media\Media Player Classic\mplayerc.exe"

shell = Dispatch('WScript.Shell')
shortcut = shell.CreateShortCut(path)
shortcut.Targetpath = target
shortcut.WorkingDirectory = wDir
shortcut.IconLocation = icon
shortcut.save()