使列表的元组包括字母顺序数字,字母,计数

时间:2015-05-27 06:55:00

标签: python list

我有一个包含小写小写的列表:

l = ['a','z','y','y','z','y','b','b']

如何制作如下所示的元组列表:

[(1, 'a', 1), (2, 'b', 2), (25, 'y', 3), (26, 'z', 2)]

我尝试调用Counter来计算我的列表中的字母,但我不知道接下来要做什么。

from collections import Counter

l = ['a','z','y','y','z','y','b','b']

c = Counter(l)
# [('a', 1), ('b', 2), ('y', 3), ('z', 2)]

4 个答案:

答案 0 :(得分:5)

获取字母序号的一种方法是调用ord函数,并将其与调用ord('a')的结果进行比较。例如:

>>> ord('s')
115
>>> ord('a')
97
>>> ord('s') - ord('a') + 1
19

另一种方法是构建一个映射并引用它:

>>> import string
>>> ordinals = {letter: ordinal 
                for ordinal, letter in enumerate(string.ascii_lowercase, 1)}
>>> ordinals['s']
19

无论哪种方式,一旦你得到了序数,将它们与Counter计数合并就很容易了:

>>> l = ['a','z','y','y','z','y','b','b']
>>> c = Counter(l)
>>> [(ordinals[letter], letter, count) for letter, count in c.items()]
[(25, 'y', 3), (1, 'a', 1), (26, 'z', 2), (2, 'b', 2)]

并且,如果您希望按顺序排序,则元组的默认排序顺序会按字典顺序查看元素 - 换句话说,(1, <anything>)位于(2, <anything>)之前,依此类推。所以:

>>> sorted((ordinals[letter], letter, count) for letter, count in c.items())
[(1, 'a', 1), (2, 'b', 2), (25, 'y', 3), (26, 'z', 2)]

答案 1 :(得分:1)

我建议您调用ascii_lowercase的{​​{1}}。它有现成的小写包括string

这是我的方法:

'abcdefghijklmnopqrstuvwxyz'

如果你想在元组的第一个元素中获得不同的结果,我教你一些技巧

from collections import Counter
from string import ascii_lowercase

l = ['a','z','y','y','z','y','b','b']

c = Counter(l)

sorted_items = sorted(c.items(), key=lambda x: x[0])

# get result when you need ordinal number of lowcase
print [ (ascii_lowercase.index(k)+1, k, v) for k, v in sorted_items]
# [(1, 'a', 1), (2, 'b', 2), (25, 'y', 3), (26, 'z', 2)]

它可以做更有趣的结果,对吧?

答案 2 :(得分:1)

r = []
for i in c:
    r.append(((ord(i) - ord('a') + 1), i, c[i]),)
r.sorted()
print r

答案 3 :(得分:1)

from collections import Counter
In[10] : l = ['a','z','y','y','z','y','b','b']
In[11] : result = [(ord(k)-96,k,v) for k,v in Counter(l).iteritems()] #ord('a') = 97
In[12] : sorted(result,key=lambda x: x[1])
Out[12] :
[(1, 'a', 1), (2, 'b', 2), (25, 'y', 3), (26, 'z', 2)]