我有一个包含小写小写的列表:
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)]
答案 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)]