在Python中迭代字典(不是一个一个)

时间:2013-07-28 23:33:52

标签: python loops dictionary indexing iteration

我遇到了这个问题: 我有这样的词典{'a':9,'b':7,'c':12,'d':5} 现在我想做一个循环(无论我为什么要这样做,只是例子): 取第一个值9并乘以dict中的每个其他值,即9 * 7 * 12 * 5 然后我想取第二个值7并将其乘以(!)之后的每个值,即7 * 12 * 5,但不包括9! 然后是12 * 5(没有9和7)的相同东西

所以问题是如何在这种情况下进行双循环,因为我不能迭代字典中的索引,它只是键,我不能写i + 1。 我可能是个愚蠢的问题,但我被困住了。

谢谢!

2 个答案:

答案 0 :(得分:2)

如果您从某种有序结构开始,您可以执行以下操作:

my_list = [('a', 9), ('b', 7), ('c', 12), ('d', 5)]

def get_dict(my_list):
    my_dict = {}
    temp = 1
    for k,v in my_list[::-1]: # iterate in reverse not to multiply same numbers
                              # over and over
        temp *= v
        my_dict[k] = temp
    return my_dict

结果:

>>> get_dict(my_list)
{'a': 3780, 'c': 60, 'b': 420, 'd': 5}

答案 1 :(得分:1)

订购钥匙后,您可以使用:

#! /usr/bin/python3
from functools import reduce

d = {'a':9,'b':7,'c':12,'d':5}

orderedKeys = sorted (d) #or whatever order you prefer
for start in range (len (orderedKeys) ):
    d [orderedKeys [start] ] = reduce (lambda x, y: x * y, (d [key] for key in orderedKeys [start:] ) )

print (d)

这产生以下内容,希望你想要的是:

{'b': 420, 'c': 60, 'a': 3780, 'd': 5}

为什么在python3中删除了reduce

编辑:或者如果您更喜欢词典理解,可以使用:

d = {orderedKeys [i]: reduce (lambda x, y: x * y, (d [key] for key in orderedKeys [i:] ) ) for i in range (len (orderedKeys) ) }