无论python中的键名如何,都按值对字典列表进行排序

时间:2014-01-18 07:19:00

标签: python dictionary

我有一个单词词典列表。每个字典只有1个键和1个值。我想通过这些值来对字典列表进行排序REGARDLESS的键名!键名与字典相同且不同。

我看到的所有在线示例都假设字典中的键名相同。这些类型的示例对我没有用,因为它们具有相同的键值:

newlist = sorted(list_to_be_sorted, key=lambda k: k['name'])

在我的例子中,我需要比较值,无论键是bob还是sarah;并排序词典列表。这是一个字典列表示例:

Times = [{"Bob":14.05}, {"Tim":15.09}, {"Tim":17.01}, {"Bob":16.81}, {"Sarah":15.08}]

期望的输出:

[{"Bob":14.05}, {"Sarah":15.08}, {"Tim":15.09}, {"Bob":16.81}, {"Tim":1701}]

3 个答案:

答案 0 :(得分:3)

times = [{"Bob":14.05},{"Tim":15.09},{"Tim":17.01},{"Bob":16.81},{"Sarah":15.08}]
print sorted(times, key=lambda k: k.values())

<强>输出

[{'Bob': 14.05},{'Sarah': 15.08}, {'Tim': 15.09}, {'Bob': 16.81}, {'Tim': 17.01}]

如果values列表中有多个值,并且您只想考虑特定索引处的元素,那么您可以

print sorted(times, key=lambda k: k.values()[0])

答案 1 :(得分:1)

怎么样:

newlist = sorted(Times, key=lambda k: k.values()[0])

它关闭了第一个(仅)字典.values()

答案 2 :(得分:0)

@thefourtheye - 你的答案非常好。

想要为那些刚接触python的人们突出一个微妙且有趣的东西。考虑这个调整到thefourtheye的答案:

times = [{"Bob":14.05},{"Tim":15.09},{"Tim":17.01},{"Bob":16.81},{"Sarah":15.08}]
print sorted(times, key=lambda k: k.itervalues().next())

产生相同的结果:

[{'Bob': 14.05}, {'Sarah': 15.08}, {'Tim': 15.09}, {'Bob': 16.81}, {'Tim': 17.01}]

调整避免了创建中间和不必要的数组。通过使用迭代器“itervalues()”然后只获取第一个值(通过.next()),sort方法只是比较原始值,而不是数组。

让我们来看看表现:

test_cases = [
    [],
    [{"Bob":14.05}],
    [{"Bob":14.05},{"Tim":15.09},{"Tim":17.01},{"Bob":16.81},{"Sarah":15.08}],
    [dict(zip((str(x) for x in xrange(50)), random.sample(xrange(1000), 50)))]      # 50 dict's in a list
]
print "perf test"
for test_case in test_cases:
    print test_case

    print "k.values()           :", timeit.repeat(
        "sorted(test_case, key=lambda k: k.values())",
        "from __main__ import test_case",
    )
    print "k.itervalues().next():", timeit.repeat(
        "sorted(test_case, key=lambda k: k.itervalues().next())",
        "from __main__ import test_case",
    )
    print

结果:

[]
k.values()           : [0.7124178409576416, 0.7222259044647217, 0.7217190265655518]
k.itervalues().next(): [0.7274281978607178, 0.7140758037567139, 0.7135159969329834]

[{'Bob': 14.05}]
k.values()           : [1.3001079559326172, 1.395097017288208, 1.314589023590088]
k.itervalues().next(): [1.2579071521759033, 1.2594029903411865, 1.2587871551513672]

[{'Bob': 14.05}, {'Tim': 15.09}, {'Tim': 17.01}, {'Bob': 16.81}, {'Sarah': 15.08}]
k.values()           : [3.1186227798461914, 3.107577085494995, 3.1108040809631348]
k.itervalues().next(): [2.8267030715942383, 2.9143049716949463, 2.8211638927459717]

[{'42': 771, '48': 129, '43': 619, '49': 450, --- SNIP --- , '33': 162, '32': 764}]
k.values()           : [1.5659689903259277, 1.6058270931243896, 1.5724899768829346]
k.itervalues().next(): [1.29836106300354, 1.2615361213684082, 1.267350196838379]

请注意,perf通常无关紧要,但考虑到2种解决方案在可读性和表达性方面相似,我认为理解后来的解决方案并在这些方面建立习惯是好的。