Python词典的词典?

Dictionary of dictionaries in Python?

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

1
2
D={realName:{falseName:[positionOfMistake], falseName:[positionOfMistake]...},
   realName:{falseName:[positionOfMistake]...}...}

函数必须采用上面这样的字典和元组作为参数。

我想先从这个开始:

1
2
3
4
5
6
7
8
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 ...

但它不起作用,我在这里有点笨。


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

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


使用collections.defaultdict可以节省大量的时间,当你做口述的时候,并且事先不知道你将拥有哪些键。

这里它使用了两次:用于生成的dict,以及dict中的每个值。

1
2
3
4
5
6
7
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

将此代码与代码组合:

1
dictionary = aggregate_names(previousFunction(string))

或测试:

1
2
3
4
5
6
EXAMPLES = [
    ('Fred', 'Frad', 123),
    ('Jim', 'Jam', 100),
    ('Fred', 'Frod', 200),
    ('Fred', 'Frad', 300)]
print aggregate_names(EXAMPLES)


字典的setdefault是更新现有dict条目(如果存在)或创建新条目(如果不是一次完成)的好方法:

循环风格:

1
2
3
4
5
6
7
8
9
# 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

字典现在等于:

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