Найдите 4 значения в размере 6 окна, которые соответствуют критериям, затем добавьте в список, пока 3 не соответствуют критериям, не включающим последние 3 -> Повторить следующее окно.питон - PullRequest
0 голосов
/ 11 декабря 2011

, если у вас есть список значений:

values=['130','90','150','123','133','120','160',
        '45','67',
        '55','34','130','120','180','130','10']

и хотел сканировать с размером окна 6, и если 4 из 6 были> = 100, то продолжайте сканирование до тех пор, пока не будет 3 подряд, которые были <100, а затем не включайте их в список </p>

так, например, с пустым списком с именем results:

results=[]

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

results=[('130','90','150','123','133','120','160'),
         ('55','34','120','180','130','10')]

я знаю, что я преобразовал все строки в целые числа с помощью int (), но это не та часть, с которой у меня возникают проблемы. У меня возникли проблемы с поиском 4 из размера окна 6, которые> = 100, добавив их в список, И затем иду от того места, где я остановился в окне

В алгоритме Чу Фасмана каждый размер окна равен 6, и если 4 больше 100, то все 6 включаются, и его значение увеличивается до 4 последовательных значений (вместо этого я собираюсь сделать 3) менее 100 (эти 4 ( или 3) не включены), а затем окно начинается снова с того места, создавая новый список.

поэтому первое окно будет:

['130','90','150','123','133,'120'] #and more than 4 are greater than
# 100 so that starting point is stored and the next window is checked
['90','150','123','133','120','160'] #again there are 4 greater than 
# 100 so the next window is checked
['150','123','133','120','160','45'] #again
['123','133','120','160','45','67'] #again
['133','120','160','45','67','55'] #stop and assign values '130' to '160'
# into a list and then start the new window from where it left off

Results=[('130','90','150','123','133','120','160')]

['120','160','45','67','55','34'] # skips
['160','45','67','55','34','130'] # skips
['45','67','55','34','130','120'] # skips
['67','55','34','130','120','180'] # skips
['55','34','130','120','180','130'] # new list in Results starts with '55'
['34','130','120','180','130','10'] # sequence ends and this window still 
# fits criteria so include these into the list so the results would now be

Results=[('130','90','150','123','133','120','160'),      
         ('55','34','130','120','180','130','10')]

Я бы очень хотел использовать циклы For и по возможности избегать выходов и генераторов, но если это единственный способ, пусть будет так

1 Ответ

1 голос
/ 11 декабря 2011

Хотите попробовать это, чтобы убедиться, что оно соответствует вашим требованиям?

for i in xrange(0,len(values)):
    results[-1].append(values[i])
    if len(filter(lambda x:int(x)<100,results[-1][-3:])) == 3:
        results.append(results[-1][-2:])
        results[-2]=results[-2][:-3]
        if len(results[-2]) == 0:
            del results[-2]


>>> results
[['130', '90', '150', '123', '133', '120', '160'], ['55', '34', '130', '120', '180', '130', '10']]
>>> 
...