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

时间:2017-07-15 10:42:55

标签: python-3.x dictionary seq

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

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

代码

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)

任何有解释的解决方案都会受到赞赏。请注意,我不想引入任何模块(因此没有默认的dict或set_default),因为这是为了初学教学/学习目的

预期输出 教学/学习目标:使用嵌套for循环

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

2 个答案:

答案 0 :(得分:1)

dict.fromkeys不会向字典添加值。

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

这种混淆可能是因为您命名了自己的字典dict,内置类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(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表示类名以及作为类的构造函数,这个(几乎)所有你将在python中遇到的类)dict将表现出来以特殊的方式遇到一系列带有2个元素的元组,就像zip生成的元素一样。

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

答案 1 :(得分:-1)

你注意到你不想使用默认字典,但是出于学习目的,这里是一个解决方案,当学习者来到它时会使用默认字典 - 在解决类似问题方面被认为是pythonic和modern:< / p>

recyclerView=(RecyclerView)findViewById(R.id.colleagues_recycler);