Я пытаюсь понять, имеет ли смысл брать содержимое списка и добавлять его в другой список.
У меня есть первый список, созданный с помощью функции цикла, которая будет извлекать определенные строки из файла и сохранять их в списке.
Затем второй список используется для сохранения этих строк и запуска нового цикла поверх другого файла.
Моя идея состояла в том, чтобы получить список, как только цикл for будет выполнен, выгрузить его во второй список, затем запустить новый цикл, снова вывести содержимое первого списка во второй, но добавив его, так что второй список будет сумма всех меньших файлов списка, созданных в моем цикле. Список должен быть добавлен только при соблюдении определенных условий.
Это выглядит примерно так:
# This is done for each log in my directory, i have a loop running
for logs in mydir:
for line in mylog:
#...if the conditions are met
list1.append(line)
for item in list1:
if "string" in item: #if somewhere in the list1 i have a match for a string
list2.append(list1) # append every line in list1 to list2
del list1 [:] # delete the content of the list1
break
else:
del list1 [:] # delete the list content and start all over
Имеет ли это смысл или я должен идти другим путем?
Мне нужно что-то эффективное, что не будет занимать слишком много циклов, так как список журналов длинный и каждый текстовый файл довольно большой; поэтому я подумал, что списки будут соответствовать цели.
Взгляните на itertools.chain для быстрого способа обработки множества маленьких списков как одного большого списка (или, по крайней мере, как одного большого итерируемого) без копирования меньших списков:
источник
Это кажется вполне разумным для того, что вы пытаетесь сделать.
Немного более короткая версия, которая опирается на Python для выполнения большей части тяжелой работы:
В
(True for line in list1 if "string" in line)
перебираетlist
и излучаетTrue
каждый раз , когда найдено совпадение.any()
использует оценку короткого замыкания для возврата,True
как толькоTrue
будет найден первый элемент.list2.extend()
добавляет содержимоеlist1
до конца.источник
any(True for line in list1 if "string" in line)
более аккуратно написано какany("string" in line for line in list1)
.any
получает генератор; нигде не создается список значений True или False. Моя версия возвращает больше вещей дляany
проверки, но взамен того, что она не выполняет ту же проверку в самом генераторе. Я предполагаю, что это мытье, ноtimeit
здесь авторитетно, а не я. :)Вы также можете объединить два списка (скажем, a, b), используя оператор «+». Например,
источник
Напомним предыдущие ответы. Если у вас есть список с
[0,1,2]
другим,[3,4,5]
и вы хотите объединить их, то он становится[0,1,2,3,4,5]
, вы можете использоватьchaining
илиextending
должны знать различия, чтобы использовать его с умом для своих нужд.Расширение списка
Используя метод
list
classesextend
, вы можете сделать копию элементов из одного списка в другой. Однако это вызовет дополнительное использование памяти, что в большинстве случаев должно быть хорошо, но может вызвать проблемы, если вы хотите эффективно использовать память.Создание цепочки списка
Наоборот, вы можете использовать
itertools.chain
для связывания многих списков, которые будут возвращать так называемые,iterator
которые можно использовать для перебора списков. Это более эффективно использует память, поскольку не копирует элементы, а просто указывает на следующий список.источник
Использование
map()
иreduce()
встроенных функцийМинимальное «зацикливание» и элегантный шаблон кодирования :)
источник
Если у нас есть список, как показано ниже:
два способа скопировать его в другой список.
1.
2.
источник