цикл for пропускает первую итерацию - PullRequest
0 голосов
/ 04 мая 2019
#!/usr/bin/env python

new_trace=[1,2,2,3,2,1,4,3,2,1,3,4,3,5,6,4,7,6,5,4,5,4,6,6,5,6,4,4,5,6,7,7,6,5,5,7,6,5]

def extractIntervals(new_trace):
    listofAppearances=[[new_trace[0]],[0],[-1]]
    for i in range(0,len(new_trace)-1,1):
        if new_trace[i] in listofAppearances[0]:
            continue
        else:
            listofAppearances[0].append(new_trace[i])
            listofAppearances[1].append(i)
            listofAppearances[2].append(-1)
    print(listofAppearances)

    for j in range(len(new_trace)-1,0,-1):
        for k in range(0,len(listofAppearances[0])-1,1):
            if (new_trace[j]==listofAppearances[0][k]) and (listofAppearances[2][k]==-1):
                listofAppearances[2][k]=j
            else:
                continue

    print(listofAppearances)

def main():
    extractLivenessIntervals(new_trace)

if __name__ == "__main__":
        main()

В моем коде выше я пытаюсь извлечь интервалы появления (разделенные индексами 1-го и последнего появления каждого числа в списке). Я делаю это один раз, когда анализирую список, и если число все еще нене существует в listOfAppearances , затем я добавляю его к первому столбцу, индекс ко второму столбцу и задаю для 3-го столбца значение -1 .

Я разбираюснова список в обратном порядке, каждый элемент ищется в listofAppearances , и соответствующий 3-й столбец заменяется текущим индексом, если все еще установлен на -1.

Это работает, но первая итерацияпри разборе списка в обратном направлении возникает проблема, которую я не могу понять.результат, который я имею с этим примером списка:

[[1, 2, 3, 4, 5, 6, 7], [0, 1, 3, 6, 13, 14, 16], [-1, -1, -1, -1, -1, -1, -1]]
[[1, 2, 3, 4, 5, 6, 7], [0, 1, 3, 6, 13, 14, 16], [9, 8, 12, 27, 37, 36, -1]]

Как вы можете видеть, последний элемент второго списка все еще установлен в -1, что я не понимаю, почему!Я проверил каждый дюйм кода и не могу понять, почему это так!

Ответы [ 2 ]

1 голос
/ 04 мая 2019

Просто изменить

for k in range(0, len(listofAppearances[0])-1, 1):

до

for k in range(0, len(listofAppearances[0]), 1):

в строке 17.


Редактировать: Вы можете получить тот же результат:

def extractIntervals(new_trace):
    listofAppearances = [0, 0, 0]
    listofAppearances[0] = list(set(new_trace))
    # returns new_trace without repeated elements

    listofAppearances[1] = [new_trace.index(i) for i in list(set(new_trace))]
    # returns a list with the index of the first occurrence
    # in new_trace of each element in list(set(new_trace))

    listofAppearances[2] = [len(new_trace) - 1 - new_trace[::-1].index(i) for i in list(set(new_trace))]
    # returns a list with the index of the last occurrence
    # in new_trace of each element in list(set(new_trace))

    print(listofAppearances)
0 голосов
/ 05 мая 2019

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

from itertools import groupby
from operator import itemgetter


second = itemgetter(1)
first_and_last = itemgetter(0, -1)


def sort_and_group(seq, k):
    return groupby(sorted(seq, key=k), k)


def extract_intervals(new_trace):
    tmp1 = sort_and_group(enumerate(new_trace), second)
    tmp2 = [(val, *first_and_last([x for x,_ in positions])) for val, positions in tmp1]
    return zip(*tmp2)


new_trace=[1,2,2,3,2,1,4,3,2,1,3,4,3,5,6,4,7,6,5,4,5,4,6,6,5,6,4,4,5,6,7,7,6,5,5,7,6,5]

print(list(extract_intervals(new_trace)))

tmp1 - это сопряжение каждого элемента со списком позиций, в которых он находится.

tmp2 - это список троек, состоящий из элемента списка и первой и последней позиции, в которой он встречается.

Вызов zip "распаковывает" список троек на три кортежа: элементы, первые позиции и последние позиции.

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