在Python中对计数列表进行排序

时间:2011-08-30 06:15:01

标签: python list count sorted

(我对任何类型的编程都是全新的,所以请在回答时尽可能具体) 问题:我编写了一个解决pythonchallenge.com级别2的程序。该程序有效但结果很混乱。我想将字符计数的结果排序为漂亮的列表。当我尝试使用sorted()对字符计数的结果进行排序时,它会删除所有计数,并只给出一个字符串列表。我需要能够查看我的文件中每个字符的数量。无论如何这里是代码:

countstring = open('pagesource.txt').read()

charcount = {}

for x in countstring:
    charcount[x] = charcount.get(x, 0) + 1

print charcount

这是我在cmd中得到的:

>>> {'\n': 1219, '!': 6079, '#': 6115, '%': 6104, '$': 6046, '&': 6043, ')': 6186, '
(': 6154, '+': 6066, '*': 6034, '@': 6157, '[': 6108, ']': 6152, '_': 6112, '^':
 6030, 'a': 1, 'e': 1, 'i': 1, 'l': 1, 'q': 1, 'u': 1, 't': 1, 'y': 1, '{': 6046
, '}': 6105}

如果我添加一个sorted()函数,例如print sorted(charcount),我会在cmd中得到它:

>>> ['\n', '!', '#', '$', '%', '&', '(', ')', '*', '+', '@', '[', ']', '^', '_', 'a'
, 'e', 'i', 'l', 'q', 't', 'u', 'y', '{', '}']

感谢您的解决方案,如果您可以花时间为您的代码添加评论,解释所有内容,我会非常感激!

6 个答案:

答案 0 :(得分:3)

你应该使用Counter课而不是重新发明自己的轮子。

charcount是一个字典,字典没有隐式排序顺序。因此,我们必须将其转换为可以排序的列表。该列表中的每个条目都是tuple计数和字符。

charcount.items()已经为我们提供了一个类似[('\n', 1219), ('!', 6079)]的列表。不幸的是,如果我们对这个列表进行排序,它将首先按字符排序然后(如果字符相等)按计数而不是相反。因此,我们需要key function来告诉排序先查看计数,然后(如果计数相等)该字符。幸运的是,我们的关键功能非常简单;它只是在元组周围交换:

lambda (char,count): (count, char)

或者,我们可以使用列表推导来交换值,得到类似:[('\n', 1219), ('!', 6079)],然后排序,然后再次交换值。

charcount_list = sorted(charcount.items(), key=lambda (char,count):(count, char))

charcount_list现在将是:

[('a', 1), ('e', 1), ('i', 1), ('l', 1), ('q', 1), ('t', 1), ('u', 1), ('y', 1),
 ('\n', 1219), ('^', 6030), ('*', 6034), ('&', 6043), ('$', 6046), ('{', 6046),
 ('+', 6066), ('!', 6079), ('%', 6104), ('}', 6105), ('[', 6108), ('_', 6112),
 ('#', 6115), (']', 6152), (' (', 6154), ('@', 6157), (')', 6186)]

如果您想要相反的顺序,只需将reverse=True参数指定为sorted

答案 1 :(得分:2)

>>> from operator import itemgetter
>>> sorted(charcount.items(), key=itemgetter(1))
[('a', 1), ('e', 1), ('i', 1), ('l', 1), ('q', 1), ('u', 1), ('t', 1), ('y', 1), ('\n', 1219), ('^', 6030), ('*', 6034), ('&', 6043), ('$', 6046), ('{', 6046), ('+', 6066), ('!', 6079), ('%', 6104), ('}', 6105), ('[', 6108), ('_', 6112), ('#', 6115), (']', 6152), (' (', 6154), ('@', 6157), (')', 6186)]

答案 2 :(得分:0)

sorted(charcount.items(), key=lambda item: item[1])

答案 3 :(得分:0)

charcountdict(字典)。迭代字典迭代它的键,这就是sorted()导致键的排序列表的原因。

您需要获取项目列表,然后按第二个值对其进行排序:

sorted(charcount.items(), key=lambda t: t[1])

答案 4 :(得分:0)

字典按键迭代,因此当您将字典传递给sorted时,您将获得一个已排序的键列表。按值对字典的项元组进行排序,以获取已排序元组的列表。

sorted_charcount = sorted(charcount.items(), key=lambda item: item[1])

如果您使用的是Python 2.7+,则可以使用元组列表初始化OrderedDict,这将保持项目元组的排序顺序。

答案 5 :(得分:0)

字典({}表示的意思)是无序集合。这意味着你无法以任何有意义的方式对它们进行排序。我建议将信息存储为元组列表[(),...],然后根据它进行排序。

foo = [('a', 123), ('b', 345)]

def key_function(x):
    return x[1]

sorted_list = sorted(foo, key_function)
print sorted_list

如您所见,sorted采用可选的第二个参数。该参数的目的是提供一个函数,告诉已排序的如何对某些内容进行排序。您所做的只是分解列表中每个元组中的信息,以提供可以订购的值,因为您无法以任何有意义的方式真正订购元组列表。

有意义吗?

它也可以写成:print sorted(foo, key=lambda (x,y): y)

lambda只是一个没有名称的内联函数,它允许你以不同的方式分解元组。

您可以通过print [y for (x,y) in sorted_list]

了解其工作原理

你甚至可以像这样重新定义之前的关键功能:

def key_function(x):
    x,y = x
    return y
顺便说一句,为了清楚起见,我之前只在括号中加上。如果你没有定义一个函数,那么逗号就是元组构造函数。