创建字典并使用循环为每个键分配多个值

creating a dictionary and assigning multiple values to each key using loops

我有以下字典,是用一组键创建的,我希望使用循环(或任何其他方法)向每个键添加多个值

注意:*这不是类似问题的重复,因为我希望使用默认字典或设置默认

代码

def main():
    #Create an empty dictionary
    dict={}

    #create a sequence of keys (USING TUPLES) that would be used to store teacher's details
    seq=('name','salary','subject')

    #create a dictionary from the sequence above
    dict=dict.fromkeys(seq)
    print(str(dict))
    #........as of yet the dictionary does not have values

    #Add values to the dictionary
    dict=dict.fromkeys(seq,10)
    print("New Dictionary with values:",dict)
    #........this obviously doesn't make sense, as a teacher's name is unlikely to be all 10!!

    #Add multiple values to the the dictionary....
    teacher_detail_values=('Mr Moose','25k','Philosophy')
    for i in range(len(dict)):
        for j in range(len(teacher_detail_values)):
            dict=dict.fromkeys(seq,teacher_detail_values(j))
    print("Final New Dictionary with values:",dict)


main()

为了获得最优雅的解决方案,我正在尝试使用的代码是:

for i in range(len(dict)):
            for j in range(len(teacher_detail_values)):
                dict=dict.fromkeys(seq,teacher_detail_values(j))
        print("Final New Dictionary with values:",dict)

感谢任何有解释的解决方案。请注意,我不想介绍任何模块(因此没有默认字典或 set_default),因为这是初学者 teaching/learning 目的

预期输出: Teaching/Learning 目标:使用嵌套 for 循环

Final New Dictionary with values: {'name': Mr Moose, 'salary': 25K, 'subject': Philosophy}

你注意到你不想使用默认字典,但出于学习目的,这里有一个解决方案,如果学习者使用默认字典 - 在解决类似问题方面被认为是 pythonic 和现代的:

>>> from collections import defaultdict
>>> dict = defaultdict(teacher_details)
>>> for i in a:
...   for j in range(int(i), int(i) + 2):
...     d[j].append(i)

dict.fromkeys 不向字典添加值。

相反,它是一种 class 构建字典的方法。 这意味着您需要将其合并到现有词典中,而不是分配通过 fromkeys 构建的词典。更深入地说,fromkeys 构造了一个具有多个键的字典,其中每个键的值都相同。这不是您要实现的目标的最佳方法,但无论如何我都会提供代码。

这种混淆可能是由于您将自己的字典命名为 dict,内置 class dict 也有这个名称。您可能应该给变量起更能说明问题的名称,例如 teacher.

此外,您不想遍历每个 属性 并为其分配每个值,而是想遍历所有属性并分配一个值,即与之配对的值。

teacher = {}
for i in range(len(seq)):
    prop_name = seq[i]
    prop_val  = teacher_detail_values[i]
    teacher.update(dict.fromkeys(prop_name, prop_val))

即使不引入更多模块,也有更多pythonic方式

teacher = dict(zip(seq, teacher_detail_values))

我将分解它的工作原理:

zip

zip(seq1, seq2)

这会将两个序列合并为一个序列,方法是将第一个序列中的一个元素与第二个序列中的一个元素配对,直到较短的序列被耗尽。例如;

zip((1, 2), (3, 4)) gives ((1, 3), (2, 4))
zip((1, 2, 5), (3, 4)) gives ((1, 3), (2, 4)) since the second is only 2 elements long

字典的构造函数(dict 表示 class 名称以及作为 class 的构造函数,这几乎适用于所有 classes 你将在 python) 中遇到 dict 当遇到具有 2 个元素的元组序列时,将以特殊方式表现,如 zip.

产生的那样

它将检查序列中的每个元组并将元组的第一个元素映射到第二个元素。所以 dict(zip((1, 2), (3, 4))) 等同于 {1: 3, 2: 4}