2015-05-27 3 views
2

У меня есть список включает в себя небольшой нижний регистр:Сделать кортежи списка включают АЛФАВИТ заказали номер, алфавит, считает

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

Как сделать кортеж-список, как ниже:

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

I попытайтесь вызвать 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)] 

ответ

1

Я Recommand вы вызываете ascii_lowercase из 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)] 

Если вы хотите, чтобы получить гладкошерстный результат в первом элементе кортежа, я научу вас некоторые трюками

# get result when you need ordinal number of count in decreasing order 
print [ (index, item[0], item[1]) for index, item in enumerate(c.most_common(),1)] 
# [(1, 'y', 3), (2, 'z', 2), (3, 'b', 2), (4, 'a', 1)] 


# get result when you need ordinal number of count in increasing order 
print [ (index, item[0], item[1]) for index, item in enumerate(sorted(c.items(), key=lambda x: x[1]),1)] 
# [(1, 'a', 1), (2, 'z', 2), (3, 'b', 2), (4, 'y', 3)] 

Он может сделать более интересный результат, не так ли?

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
r = [] 
for i in c: 
    r.append(((ord(i) - ord('a') + 1), i, c[i]),) 
r.sorted() 
print r 
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)] 
Смежные вопросы