Python词典?

2024-06-01 10:06:55 发布

您现在位置:Python中文网/ 问答频道 /正文

从另一个函数,我有这样的元组('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 ...

但它不起作用,我有点累了。


Tags: 函数参数dictionaryif字典defelementmilter
3条回答

如果只添加一个新元组,并且您确定内部字典中没有冲突,则可以执行以下操作:

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

在构建dict时,使用collections.defaultdict可以节省大量的时间,而且事先不知道您将拥有哪些密钥。

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

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)

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

循环样式:

# 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}}

相关问题 更多 >