我有代码来排序元组列表:
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的整数值排序。
答案 0 :(得分:5)
reversed
和sorted
不会就地排序;相反,他们返回新排序和反转的对象。将第二行更改为
z = list(reversed(sorted(z, key=lambda x: x[1])))
它会起作用。 list
调用是因为reversed
返回迭代器而不是列表(至少在Python3上)。
执行以下操作可能不那么冗长
z = sorted(z, key=lambda x: x[1], reverse=True)
答案 1 :(得分:4)
对于就地排序,您应该使用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)]
答案 2 :(得分:2)
这几乎是正确的 - 如果你在Python REPL中查看帮助(反向),你会发现它返回一个迭代器,其中包含基于你的dict值的排序结果。
如果您希望z在计数时存储更新的反向排序列表,则需要重新分配z:
z = list(reversed(sorted(z, key=lambda x: x[1])))
编辑:只是为了澄清,迭代器对象的最外层列表转换将迭代器转换为迭代器中包含的对象列表。
答案 3 :(得分:1)
对您的代码进行最少的更改:
order
sorted()没有排序,它有一个你省略的内置反向选项。
答案 4 :(得分:1)
要计算字符串中的字数,您只需使用Counter
中的collections
即可。然后按计数的降序对其进行排序。
您的代码可以缩短为
from collections import Counter
s = "betty bought a bit of butter but the butter was bitter"
c = Counter(i for i in s.split())
print sorted(c.items(),key=lambda x:x[1],reverse=True)