如何根据列表值排序字典?

时间:2020-07-22 17:27:52

标签: python sorting dictionary

我有这样的字典:

{'elmo': [4, 3], 'elsa': [4, 2], 'legos': [0, 0], 'drone': [1, 1], 'tablet': [0, 0], 'warcraft': [1, 1]}

现在,这些值表示: elmo这个词在所有引号中显示的是最全面的词,并被引用了3个引号。 现在,elmo和elsa都被引用了4次,但是elmo必须先被引用,因为它已经被更多的引用引用了。 给定最需要的n个最常用词,我必须得到这样的输出 如果n = 2,则必须返回 ['elmo','elsa'] 是否只有一个这样的值:

{'elmo': 4, 'elsa': 4, 'legos': 0, 'drone': 1, 'tablet': 0, 'warcraft': 1}

我将其转换为这样的列表:

arr = [('elmo', 4), ('elsa', 4), ('legos', 0) ...]

然后我将执行此操作:

return [x for x, _ in sorted(arr, key=lambda x: x[1])]

所以,这很容易。但是现在有两个值,例如[4、3]等。如何对sort()中的key关键字使用两个值?

编辑:

现在,假设我的字典是:

{'coach': [9, 7], 'make': [15, 9], 'modern': [9, 8], 'suggest': [4, 4], 'behavior': [11, 10], 'past': [12, 10], 'affect': [5, 5], 'billion': [5, 4], 'nor': [11, 10], 'last': [9, 8]}

如果我这样做:

r = [(k, v) for k, v in zip(word_map.keys(), word_map.values())]
r.sort(key=lambda x: x[1][1], reverse=True)
return [t for t, _ in r]

(其中word_map是我的词典名称) 我必须得到:

['past', 'behavior', 'nor', 'make', 'modern', 'last', 'coach', 'affect',  'billion','suggest']

但是我得到了:

['behavior', 'past', 'nor', 'make', 'modern', 'last', 'coach', 'affect', 'suggest', 'billion']

4 个答案:

答案 0 :(得分:0)

您可以使用list comprehensionunpacking

>>> d = {'elmo': [4, 3], 'elsa': [4, 2], 'legos': [0, 0], 'drone': [1, 1], 'tablet': [0, 0], 'warcraft': [1, 1]}
>>> [name for name, (q1, q2) in d.items() if q2 >= 2]
['elmo', 'elsa']

排序:

>>> sorted(d, key=lambda x:d[x], reverse=True)
['elmo', 'elsa', 'drone', 'warcraft', 'legos', 'tablet']

根据 EDIT

>>> sorted(d, key=lambda x:(d[x][1], d[x][0]), reverse=True)
# or, sorted(d, key=lambda x:[*d[x]][::-1], reverse=True)
['past', 'behavior', 'nor', 'make', 'modern', 'last', 'coach', 'affect', 'billion', 'suggest']

答案 1 :(得分:0)

在转换为元组列表时,通过将值的arr = [('elmo', 4), ('elsa', 4), ('legos', 0) ...]元素存储在dict的key:value对中,以0th格式存储。

for k,v in dictionary.items():
    arr.append((k,v[0]))

return [x for x, _ in sorted(arr, key=lambda x: x[1])]

答案 2 :(得分:0)

d = {'elmo': [4, 3], 'elsa': [4, 2], 'legos': [0, 0], 'drone': [1, 1], 'tablet': [0, 0], 'warcraft': [1, 1]}

output = sorted(d.items(), key=lambda k,v:(k[0], k[1]), reverse=True)
output = [x[0] for x in output][0:n]

答案 3 :(得分:0)

您是否尝试过将排序键设为元组?

data = {
  'coach': [9, 7], 
  'make': [15, 9], 
  'modern': [9, 8], 
  'suggest': [4, 4], 
  'behavior': [11, 10], 
  'past': [12, 10], 
  'affect': [5, 5], 
  'billion': [5, 4], 
  'nor': [11, 10], 
  'last': [9, 8]
}
sorted_data = sorted(
  data.items(), 
  reverse=True, 
  key=lambda item: (item[1][1], item[1][0])
)
sorted_keys = [x[0] for x in sorted_data]