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

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

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

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

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

results=[]

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

results=['130','90','150','123','133','120','160','180']

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

я пытался:

count=0
for i in values:
    if int(i)=> 100:
        count=count+1

, но это не работало


размер окна равен 6, поэтому первое окно будет ['130', '90', '150', '123', '133', '120'], и 5 из 6 из этих значений превышают 100так что переходите на одно место снова, и тогда окно будет ['90', '150', '123', '133', '120', '160'], снова будет 5 из 6, то есть более 100, поэтому оно будет прогрессироватьнад еще одним местом.пока он не достигнет окна с ['160', '180', '45', '67', '55', '34'], он не остановится, потому что было 4 последовательных значения меньше 100 в строке.таким образом, все значения от 130 до 180 помещаются в список.Надеюсь, что это объясняет лучше

Ответы [ 3 ]

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

Я бы попробовал что-то вроде этого.

results = []
for i, v in enumerate(values):
    if sum(1 for x in values[max(0, i - 3): i + 2] if int(x) > 100) >= 4:
        results.append(v)

Из вопроса, где ваши окна, и что происходит в конце, не ясно, но я сделал разумные предположения, я думаю.

0 голосов
/ 11 декабря 2011
def windows(values):
    index = 0
    window_size = 6
    while True:
        yield values[index:index + window_size]
        index += 1
        if index > len(values) - window_size:
            return

def are_four_above_100(window):
    count = 0
    for element in window:
        if int(element) > 100:
            count += 1
     if count > 4:
         return True
     else:
         return False

for i, window in enumerate(windows(values)):
    if not are_four_above_100(window):
        print 'found window at index %s' % i
        break

found window at index 4

Как только вы найдете этот индекс, вы можете просто выполнить гораздо более простую проверку для 4 подряд ниже 100. Если вам все еще нужна помощь, сообщите нам.Я уверен, что кто-то другой может сжать это :), но это не моя забота.

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

Вы можете использовать этот код, чтобы найти индекс начала вашего окна:

ints = map(int, values)
for i in range(len(ints) - 6):
    if sum(x >= 100 for x in ints[i : i + 6]) >= 4:
        return i

Это может быть реализовано более эффективно, используя скользящее окно, где у вас есть буфер из 6 элементов, и на каждом шаге добавляйте элемент и удаляйте его, корректируйте счетчик хода на +1, 0 или -1.

...