我有一份单目词典的清单。每个字典只有一个键和一个值。我想按这些值对字典列表进行排序,而不考虑键名!每个词典的关键字名称都是相同的,也是不同的。
我在网上看到的所有例子都在字典中使用了相同的键名。这些类型的示例不适用于我,因为它们具有相同的键值:
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}]发布于 2014-01-18 07:24:34
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])发布于 2014-01-18 07:24:29
那麽:
newlist = sorted(Times, key=lambda k: k.values()[0])它关闭字典的.values()的第一个(仅)
发布于 2014-01-18 08:04:54
@第四位--你的回答很好。
想要强调一个微妙的,海事组织的有趣的事情,为人们新的python。考虑一下第四位回答的这一点:
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}]这种调整避免了中间数组和不必要数组的创建。通过使用迭代器“itervalue()”,然后只获得第一个值(通过.next()),排序方法只是比较原始值,而不是数组。
让我们来看看性能:
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通常并不重要,但是考虑到这两种解决方案在可读性、表现性方面是相似的,我认为理解后一种解决方案并在这些术语中建立习惯是很好的。
https://stackoverflow.com/questions/21201278
复制相似问题