首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >按值对字典列表进行排序,而不考虑python中的键名

按值对字典列表进行排序,而不考虑python中的键名
EN

Stack Overflow用户
提问于 2014-01-18 07:18:59
回答 3查看 165关注 0票数 1

我有一份单目词典的清单。每个字典只有一个键和一个值。我想按这些值对字典列表进行排序,而不考虑键名!每个词典的关键字名称都是相同的,也是不同的。

我在网上看到的所有例子都在字典中使用了相同的键名。这些类型的示例不适用于我,因为它们具有相同的键值:

代码语言:javascript
复制
newlist = sorted(list_to_be_sorted, key=lambda k: k['name'])

在我的示例中,无论键是bob还是sarah,我都需要比较这些值,并对字典列表进行排序。下面是字典的示例列表:

代码语言:javascript
复制
Times = [{"Bob":14.05}, {"Tim":15.09}, {"Tim":17.01}, {"Bob":16.81}, {"Sarah":15.08}]

期望产出:

代码语言:javascript
复制
[{"Bob":14.05}, {"Sarah":15.08}, {"Tim":15.09}, {"Bob":16.81}, {"Tim":1701}]
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-01-18 07:24:34

代码语言:javascript
复制
times = [{"Bob":14.05},{"Tim":15.09},{"Tim":17.01},{"Bob":16.81},{"Sarah":15.08}]
print sorted(times, key=lambda k: k.values())

输出

代码语言:javascript
复制
[{'Bob': 14.05},{'Sarah': 15.08}, {'Tim': 15.09}, {'Bob': 16.81}, {'Tim': 17.01}]

如果values列表中有多个值,并且希望只考虑特定索引上的元素,则可以这样做。

代码语言:javascript
复制
print sorted(times, key=lambda k: k.values()[0])
票数 3
EN

Stack Overflow用户

发布于 2014-01-18 07:24:29

那麽:

代码语言:javascript
复制
newlist = sorted(Times, key=lambda k: k.values()[0])

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

票数 1
EN

Stack Overflow用户

发布于 2014-01-18 08:04:54

@第四位--你的回答很好。

想要强调一个微妙的,海事组织的有趣的事情,为人们新的python。考虑一下第四位回答的这一点:

代码语言:javascript
复制
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())

其结果是相同的:

代码语言:javascript
复制
[{'Bob': 14.05}, {'Sarah': 15.08}, {'Tim': 15.09}, {'Bob': 16.81}, {'Tim': 17.01}]

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

让我们来看看性能:

代码语言:javascript
复制
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

结果:

代码语言:javascript
复制
[]
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通常并不重要,但是考虑到这两种解决方案在可读性、表现性方面是相似的,我认为理解后一种解决方案并在这些术语中建立习惯是很好的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21201278

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档