Dictionary of dictionaries in Python?
从另一个函数,我有这样的元组
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]] |
使用
这里它使用了两次:用于生成的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}} |