Зацикливание и обработка элементов в списке, перезапуск до тех пор, пока все элементы не будут обработаны

1

Я нашел похожие, но не одинаковые вопросы 742371 и 4081217 с большими ответами, но не пришел к решению моей проблемы.

Я пытаюсь обрабатывать элементы в списке на месте, когда он зацикливается, и повторно зацикливать на том, что осталось в списке, если он не выполнил условие. В конечном итоге условное будет выполняться как True для всех элементов в списке, но не обязательно на "известной" итерации. Это напоминает мне о создании дерева в некоторой степени, поскольку некоторые элементы в списке должны обрабатываться перед другими, но другие могут быть зациклированы заранее.

Мой первый инстинкт - создать рекурсивную функцию и отредактировать фрагментную копию списка. Однако мне не повезло ~

Я не буду изначально знать, сколько проходов он примет, но он никогда не может быть больше проходов, чем элементы в списке... просто по характеру хотя бы один элемент всегда будет соответствовать условному, как True

В идеале... результат будет примерно следующим:

 # initial list
myList = ['it1', 'test', 'blah', 10]
newList = []

# first pass
newList = ['test']

# 2nd pass
newList = ['test', 'blah', 10]

# 3rd pass 
newList = ['test', 'blah', 10, 'it1']
Теги:
list
tree

3 ответа

4
Лучший ответ
current = ['it1', 'test', 'blah', 10]
results = []
while current:
    remaining = []
    for item in current:
        (results if meets_conditional(item) else remaining).append(item)
    current = remaining
  • 0
    кажется, идет в бесконечный цикл ~ def meet_conditional (item): если тип (item) равен str: return True; еще: вернуть Ложь
  • 0
    Вы сказали: «Условие будет в конечном итоге выполнено как True для всех элементов в списке» - в этом случае этот метод будет работать. Так как 10 никогда не является str , ваш пример не соответствует этим критериям. Кроме того, используйте isinstance не type в целом.
Показать ещё 1 комментарий
1

Как насчет чего-то вроде этого (просто было глупое состояние, чтобы я мог проверить его):

import random

myList = ['it1', 'test', 'blah', 10]
newList = []

def someCondition(var):
    return random.randrange(0,2) == 0

def test():

    while len(myList) > 0:
        pos = 0
        while pos < len(myList):
            if someCondition(myList[pos]):  # with someCondition being a function here
                newList.append(myList.pop(pos))
            else:
                pos += 1

if __name__ == '__main__':
    test()
    print(myList)
    print(newList)

[Результат:]

[]
['it1', 10, 'blah', 'test']
  • 0
    Каждый pop - O (n), так что вы можете получить лучшую временную сложность с помощью метода @ Karl.
0

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

В каждом проходе, когда элемент в индексе i исходного списка удовлетворяет условию, обновите значение во временном массиве с индексом i с помощью False.

В каждом последующем проходе смотрите только значения, где соответствующий индекс False. Остановитесь, когда все значения стали True.

Grr, подумайте об этом, сохраните set индексов, которые удовлетворяли условию. Да, наборы лучше, чем массивы булевых.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню