我有用于对元组列表进行排序的代码:
s = "betty bought a bit of butter but the butter was bitter"
words = s.split()
l = []
k = []
unique_words = sorted(set(words))
for word in unique_words:
k.append(word)
l.append(words.count(word))
z = zip(k,l)
print z
reversed(sorted(z, key=lambda x: x[1]))
print z
z是相同的,列表没有被排序甚至被颠倒。
我正在尝试按count的整数值排序。
对于就地排序,应使用z.sort()
。
如果您坚持使用sorted
,则将值发送回z
。
因此,使用其中之一,
z.sort(key = lambda x:x[1])
z.reverse()
或,
z = reversed(sorted(z, key=lambda x: x[1]))
或者,更复杂的解决方案可能是:
z = sorted(z, key=lambda x: x[1], reverse= True)
事实上,使用collections.Counter()
可以更轻松地获得最终结果>
from collections import Counter z = sorted(Counter(s.split()).items(), key = lambda x:x[1], reverse = True)
通过两个多个键排序可以,您可以将它们作为元组传递。对于您而言,解决方案是:
# first sort by negatives of the second item, then alphabetically. z = sorted(z, key=lambda x: (-x[1],x[0]))
输出:
[('butter', 2), ('a', 1), ('betty', 1), ('bit', 1), ('bitter', 1),
('bought', 1), ('but', 1), ('of', 1), ('the', 1), ('was', 1)]
reversed
和sorted
不能就地排序;相反,它们返回新排序和反向的对象。将倒数第二行更改为
这几乎是正确的-如果您在Python REPL中检查help(反转),您会发现它返回了一个迭代器,该迭代器包含基于dict值的排序结果。
最少更改您的代码:
要计算字符串中的单词,您可以简单地使用Counter
中的collections
。然后按计数的降序对其进行排序。