Форум сайта python.su
0
День добрый,
Не могу сообразить как решить на python 2.7 задачку с подсчетом “подстрок” в “строке”.
дан список например
a = [0,1,2,1,1,1,1]
b = {1:3, 4:1}
a = [a,a,a,b,b,b,a,a,a] b = {3:3}
a = [1,1,1,1,0,1,0,1,1,1,1] b = {1:3, 4:2}
a = [1,0,0,1,1,1,0,0,0,0,1,1,1,1,1] b = {1:1, 2:1, 3:1, 4:1, 5:1}
Отредактировано Senhion (Фев. 11, 2014 07:51:50)
Офлайн
0
Как я понимаю, Вы хотите это сделать без перебора, потому что если с ним, то все делается довольно таки просто:
a = [0,1,2,1,1,1,1,2,3,0] # исходный массив b = {} #результат for row in a: try: b[row] += 1 except KeyError: b[row] = 1 print(b)
Офлайн
0
Видимо я не совсем верно описал условие задачи 
Мне необходимо подсчитать не количество каждого символа в списке а количество “островов” (непрерывных последовательностей) символов одинакового размера…
т.е. для
a = [1,1,1,1,0,1,0,1,1,1,1]
b = {0: 2, 1: 9}
b = {1:3, 4:2}
a = [1,1,1,1,0,0,1,0] #построение частотного словаря dictionary = [] for x1 in range(len(a)): for y in range(1,len(a) - x1 + 1): if dictionary.count(a[x1:(x1+y)]) == 0: dictionary.append(a[x1:(x1+y)]) #оставляем только моно резульаты mono_dictionary = [] for ent in dictionary: if ent.count(ent[0]) == len(ent) : mono_dictionary.append(ent)

Отредактировано Senhion (Фев. 11, 2014 12:10:12)
Офлайн
0
Senhion
Видимо я не совсем верно описал условие задачи Мне необходимо подсчитать не количество каждого символа в списке а количество “островов” (непрерывных последовательностей) символов одинакового размера…т.е. для
Офлайн
0
В принципе да… можно построить словарь - и перевести список в строку.
хорошо, тогда как в строке
str('1,1,1,1,0,0,1,0')
поэтому мозги и пытаются решать привычными методами.
Офлайн
0
Senhion
К сожалению “а” планируется длиной в 65000 и более… так что я сомневаюсь что мой способ будет с этим нормально работать…
:#!/usr/bin/python test_data=[['a','a','a','b','b','b','a','a','a'], [1,1,1,1,0,1,0,1,1,1,1], [1,0,0,1,1,1,0,0,0,0,1,1,1,1,1]] def get_consecutive_stat(in_list): resDict = dict() counter = 1 for i in xrange(len(in_list)-1): if in_list[i] == in_list[i+1]: counter += 1 else: if counter in resDict: resDict[counter] += 1 else: resDict[counter] = 1 counter = 1 if counter in resDict: resDict[counter] += 1 else: resDict[counter] = 1 return resDict for test in test_data: print(get_consecutive_stat(test))
Отредактировано nekey975 (Фев. 11, 2014 16:42:01)
Офлайн
3
from itertools import groupby from collections import Counter a = [1,0,0,1,1,1,0,0,0,0,1,1,1,1,1] dictionary = {} occurrences_list = [len(list(group)) for key, group in groupby(a)] for key1, value in Counter(occurrences_list).items(): dictionary[key1] = value print dictionary
{1: 1, 2: 1, 3: 1, 4: 1, 5: 1}
Отредактировано TroSer (Фев. 11, 2014 17:01:08)
Офлайн
0
TroSer, Спасибо - похоже то что надо.
А можно обьяснить что происходит в
occurrences_list = [len(list(group)) for key, group in groupby(a)]
Отредактировано Senhion (Фев. 12, 2014 08:03:19)
Офлайн
221
Senhion
генератор списка зовется, это чутка особая конструкция; groupby из itertools модуля
Офлайн
19
я первый раз сталкиваюсь с подобной конструкцией когда перед for стоит что-тоЭто генератор, одна и лучших возможностей в питоне.
Офлайн