2015-11-25 2 views
-3

Каков наилучший способ вычисления гистограммы длины списка (строк) с помощью Python 3?Считать символы строк в списке и классифицировать по группам

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

Для следующего списка ввода:

lis = [ "this" , "is" , "what" , "i" , "have" , "to" , "do" ] 

Ожидаемый результат:

Letters per word: 

3 with 4 letters 
3 with 2 letters 
1 with 1 letters 

Есть встроенный контейнер или функция, которая облегчает это?

+2

Оно не ясно, что ваша проблема или вопрос прямо сейчас, пожалуйста, попробуйте и перефразировать то, что вам нужно. – Vality

ответ

8

Использование collections.Counter и map:

>>> from collections import Counter 
>>> Counter(map(len, lis)) 
Counter({2: 3, 4: 3, 1: 1}) 
+4

Я люблю и ненавижу этот ответ, потому что это сразу потрясающий кусок Python и ответ на вопрос, который должен быть закрыт. –

+0

@ Two-BitAlchemist У меня такое же смешанное чувство после публикации его, читая комментарий нальтипара и понимая это. Может быть, ОП все еще может решить свой вопрос? – arekolek

+1

@arekolek Это, наверное, хорошо, хотя для ясности это может выдержать некоторое редактирование. Однако сегодня; сегодня помощь вампиров выиграла. :( –

1

Вы можете использовать Counter from collections, который отсчитывает любое hashable значение в Iterable

>>> lis = [ "this" , "is" , "what" , "i" , "have" , "to" , "do" ] 
>>> from collections import Counter 
>>> count = Counter(len(x) for x in lis) 
>>> for key in count: 
    print(count[key], 'with', key, 'letters') 


1 with 1 letters 
3 with 2 letters 
3 with 4 letters 
0

Я хотел бы использовать collections.defaultdict:

import sys 
import collections 

def processData(data): 
    results = collections.defaultdict(list) 
    for word in data: 
     results[len(word)].append(word) 
    return results 

if len(sys.argv) > 1: 
    data = sys.argv[1:] 
    print "Letters per word:\n" 
    for k,v in dict(processData(data)).iteritems(): 
     print "{} with {} letters --> {}".format(len(v), k, ', '.join(v)) 

Выход:

➜ python test.py stack overflow rocks 
Letters per word: 

1 with 8 letters --> overflow 
2 with 5 letters --> stack, rocks 
0
lis = [ "this" , "is" , "what" , "i" , "have" , "to" , "do" ] 
a=[] 
for item in lis: 
    a.append(len(item)) 
b=set(a) 
print "Letters per words are :" 
for item in b: 
    k=a.count(item) 
    print "%d with %d letters"%(k,item) 
Смежные вопросы