Я нашел похожие, но не одинаковые вопросы 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']
current = ['it1', 'test', 'blah', 10]
results = []
while current:
remaining = []
for item in current:
(results if meets_conditional(item) else remaining).append(item)
current = remaining
Как насчет чего-то вроде этого (просто было глупое состояние, чтобы я мог проверить его):
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']
pop
- O (n), так что вы можете получить лучшую временную сложность с помощью метода @ Karl.
Подход грубой силы должен был бы создать временный список логических элементов того же размера, что и ваш исходный список, инициализированный False
всем мире.
В каждом проходе, когда элемент в индексе i
исходного списка удовлетворяет условию, обновите значение во временном массиве с индексом i
с помощью False.
В каждом последующем проходе смотрите только значения, где соответствующий индекс False
. Остановитесь, когда все значения стали True
.
Grr, подумайте об этом, сохраните set
индексов, которые удовлетворяли условию. Да, наборы лучше, чем массивы булевых.
10
никогда не являетсяstr
, ваш пример не соответствует этим критериям. Кроме того, используйтеisinstance
неtype
в целом.