【问题标题】:Sort a dictionary by length of the value [closed]按值的长度对字典进行排序[关闭]
【发布时间】:2013-12-26 04:38:05
【问题描述】:

我有一本字典:

d = {'a':[1,3], 'b':[3,4,5,6], 'c':[1], 'd':[1,2,3] }

我想用前两个键值对创建一个更小的新字典,按值中列表的len 排序。所以在这种情况下,我想要:

newd = {'b':[3,4,5,6], 'd':[1,2,3] }

我尝试了this answer,但得到了这个错误:

NameError: global name 'd' is not defined

【问题讨论】:

  • 请准确发布您尝试实施其他解决方案的方式。它看起来完全像您想要的那样,所以您在调整代码时一定犯了一个错误。当我使用其他代码时,它对我来说非常好。
  • @FelixKling 我没有调整代码。我只是从答案中复制并粘贴。
  • 嗯,我也做了,它对我有用。见codepad.org/RyobPnHY。您是否也复制了>>>?事实上,这个问题只是重复的。我们无法帮助您学习正确复制和粘贴代码。
  • "前两个键:值对,按值中列表的len 排序" - 你知道字典没有顺序,对吧?如果您只想要具有前两个最长值的键值对,那很好,但如果您希望 dict 按值长度排序,则会遇到问题。
  • @user2357112 我不关心新字典中的顺序,只是它们根据值的长度包含前 n 个 key:values 对。

标签: python sorting dictionary


【解决方案1】:

一种方法是根据值的长度对项目进行排序,然后根据最后两项创建字典。

sorted_items = sorted(d.items(), key = lambda item : len(item[1]))
newd = dict(sorted_items[-2:])

【讨论】:

  • 我认为将reverse=true 传递给sorted 比之后反转整个列表更高效。如果您解释一下 [::-1] 的确切含义,这可能也会有所帮助。
  • 或者切掉最后两个dict(sorted_items[-2:])
  • @Felix King:可能是这样。将代码调整为仅对最后两个进行切片。
  • @gnibbler,我正在按照您的建议进行编辑,但如果您只切片最后两个,则反转是无关紧要的。
  • @halex 和 mgilson。好的,谢谢!
【解决方案2】:

似乎是heapq 的工作:

big_items = heapq.nlargest(2, d.items(), key=lambda x: len(x[1]))
newd = dict(big_items)

heapq 相对于sorted 的优势在于它提供了 O(N) 时间复杂度,而 sorted 将产生 O(NlogN) 时间复杂度。对于小型听写,这可能无关紧要。 sorted 甚至可能更快,因为实现更优化,但对于大字典,这实际上可能会为您带来显着的加速。


(在python2.x上,你可以使用d.iteritems()代替d.items()

【讨论】:

  • +1 虽然sorted 在大多数情况下可能更快
  • @gnibbler -- 这取决于字典的大小。
  • 我知道big-O,但在这种情况下常数很大,所以需要一段时间才能超过它。
  • @gnibbler -- 是的,我在其中添加了一个警告,关于使用sorted 处理较小的字典。
  • @mchangun -- 不确定。最好的办法是timeit 找出答案。
猜你喜欢
  • 2013-05-27
  • 1970-01-01
  • 2020-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-18
  • 1970-01-01
相关资源
最近更新 更多