在循环中使用字典

时间:2015-08-12 14:11:22

标签: python dictionary

我正在尝试编写一个复制贪婪算法的代码,为此我需要确保我的计算尽可能使用最高值。潜在值显示在字典中,我的目标是首先使用最大值,然后继续使用较低的值。然而,由于字典值没有排序,在for循环中我得到的是无组织的序列。例如,下面代码的输出将从25开始。

如何确保我的代码按照(500,100,25,10,5)的顺序使用字典?

a={"f":500,"o":100,"q":25,"d":10,"n":5}  
for i in a:
    print a[i]

4 个答案:

答案 0 :(得分:3)

有两个想法浮现在脑海中:

  1. 使用collections.OrderedDict,这是一个字典子类,可以记住添加项目的顺序。只要按降序值顺序添加对,循环遍历此dict将以正确的顺序返回它们。

  2. 如果你不能确定这些项目会以正确的顺序添加到dict中,你可以通过排序来构建它们:

    • 使用values()
    • 获取字典的值
    • 按(升序)值排序:这是sorted(),Python默认按升序排序
    • 改为以降序值获取它们:这是reverse=True

    以下是一个例子:

    for value in sorted(a.values(), reverse=True):
        print value
    

答案 1 :(得分:3)

当您正常迭代它们时,字典会生成它们的键,但您可以使用items()视图来获取键和值的元组。这将是未经订购的,但您可以在"第一个"上使用sorted()。元组的元素(值),反向设置为True:

a={"f":500,"o":100,"q":25,"d":10,"n":5}  
for k, v in sorted(a.items(), key=operator.itemgetter(1), reverse=True):
    print(v)

我猜你确实需要密钥,但如果没有,你可以使用values()代替items()sorted(a.values(), reverse=True)

答案 2 :(得分:1)

您可以使用此

>>> a={"f":500,"o":100,"q":25,"d":10,"n":5}
>>> for value in sorted(a.itervalues(),reverse=True):
...     print value
... 
500
100
25
10
5
>>> 

答案 3 :(得分:-1)

a={"f":500,"o":100,"q":25,"d":10,"n":5}
k = sorted(a, key=a.__getitem__, reverse=True)
v = sorted(a.values(), reverse=True)
sorted_a = zip(k,v)
print (sorted_a)

输出:

[('f', 500), ('o', 100), ('q', 25), ('d', 10), ('n', 5)]