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

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

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

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

так, например, с пустым списком, называемым результатами:

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». Надеюсь, это объясняет это лучше


person O.rka    schedule 10.12.2011    source источник


Ответы (3)


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

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.

person Mark Byers    schedule 10.12.2011
comment
не удалось запустить эту функцию по какой-то причине - person O.rka; 11.12.2011
comment
Я понятия не имел, что sum([True, True, True]) равно трем. - person Derek Litz; 11.12.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)

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

person Community    schedule 10.12.2011
comment
размер окна равен 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». Надеюсь, это объясняет это лучше - person O.rka; 11.12.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. Если вам все еще нужна помощь, сообщите нам об этом. Я уверен, что кто-то другой может сократить это :), но это не было моей заботой.

person Derek Litz    schedule 11.12.2011
comment
k круто, я попытаюсь понять, как поместить это в одну функцию. я не знаком с yield, но я создаю довольно сложную функцию, и это самая сложная часть для меня, чтобы понять. большое спасибо! - person O.rka; 11.12.2011
comment
хорошо, когда вы получаете объект генератора из оконной функции. вы можете увидеть первое окно, когда вы делаете .next(), но как вы можете поместить эти значения в другой список или функцию? - person O.rka; 11.12.2011
comment
Кроме того, мое использование генератора окон могло быть замаскировано выше перечислением (в цикле for). - person Derek Litz; 11.12.2011
comment
я не могу понять, как эти генераторы работают в сложных сценариях. я сейчас что-то работаю с циклами for - person O.rka; 11.12.2011