Python中的字典嵌套字典?

20

我从另一个函数中得到了像这样的元组:('falseName', 'realName', positionOfMistake),例如 ('Milter', 'Miller', 4)。 我需要编写一个函数来创建这样的字典:

D={realName:{falseName:[positionOfMistake], falseName:[positionOfMistake]...}, 
   realName:{falseName:[positionOfMistake]...}...}
函数必须将字典和上述元组作为参数进行传递。
我最初的想法是这样的:
def addToNameDictionary(d, tup):
    dictionary={}
    tup=previousFunction(string)
    for element in tup:
        if not dictionary.has_key(element[1]):
            dictionary.append(element[1])
    elif:
        if ...

但是它不起作用,而且我有点卡在这里了。


你的缩进有误。还有,具体是哪里出了问题? - yurib
2
参数中的“tup”被“tup=previ..”这行代码覆盖了。你的代码看起来好像没有把整个大局放在脑海里。我建议你停下来,离开电脑,深呼吸,散步一下,坐下来,闭上眼睛,用铅笔和纸写下代码。 - matiu
3个回答

17

如果只是要添加一个新的元组,并且您确定内部字典中没有冲突,那么可以这样做:

def addNameToDictionary(d, tup):
    if tup[0] not in d:
        d[tup[0]] = {}
    d[tup[0]][tup[1]] = [tup[2]]

3
has_key测试更好地写成if tup[0] not in d:。请注意,此翻译并未添加解释或其他额外信息。 - user97370
7
has_key() 已经被弃用并从 Python 3 中移除。 - Tim Pietzcker
1
这段代码非常有用。我正在处理从文件中提取的嵌套字典数据,这段代码成为了我曾经尝试组合失败函数的完美替代品(在进行一些特定于我的用例的轻微修改后)。感谢您的帖子! - TMWP

12

在构建字典时,如果事先不知道将要使用哪些键,使用collections.defaultdict可以节省大量时间。

这里它被使用了两次:一次用于结果字典,另一次用于字典中的每个值。

import collections

def aggregate_names(errors):
    result = collections.defaultdict(lambda: collections.defaultdict(list))
    for real_name, false_name, location in errors:
        result[real_name][false_name].append(location)
    return result

结合您的代码:

dictionary = aggregate_names(previousFunction(string))

或者进行测试:

EXAMPLES = [
    ('Fred', 'Frad', 123),
    ('Jim', 'Jam', 100),
    ('Fred', 'Frod', 200),
    ('Fred', 'Frad', 300)]
print aggregate_names(EXAMPLES)

8

dictionary的setdefault是一种很好的方法,可以在一个操作中更新已存在的字典条目,如果没有则创建一个新的:

循环样式:


结果: dictionary的setdefault是一种很好的方法,可以在一个操作中更新已存在的字典条目,如果没有则创建一个新的:
循环样式:
# This is our sample data
data = [("Milter", "Miller", 4), ("Milter", "Miler", 4), ("Milter", "Malter", 2)]

# dictionary we want for the result
dictionary = {}

# loop that makes it work
for realName, falseName, position in data:
    dictionary.setdefault(realName, {})[falseName] = position

字典现在等于:

{'Milter': {'Malter': 2, 'Miler': 4, 'Miller': 4}}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接