我有一个单词词典列表。每个字典只有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}]
答案 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种解决方案在可读性和表达性方面相似,我认为理解后来的解决方案并在这些方面建立习惯是好的。