Возьмите содержимое списка и добавьте его в другой список.

Я пытаюсь понять, имеет ли смысл брать содержимое списка и добавлять его в другой список.

У меня есть первый список, созданный с помощью функции цикла, которая будет извлекать определенные строки из файла и сохранять их в списке.

Затем второй список используется для сохранения этих строк и запуска нового цикла поверх другого файла.

Моя идея состояла в том, чтобы получить список, как только цикл 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

Имеет ли это смысл или я должен идти другим путем?

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

Ответ 1

Вероятно, вы хотите

list2.extend(list1)

вместо

list2.append(list1)

Здесь разница:

>>> a = range(5)
>>> b = range(3)
>>> c = range(2)
>>> b.append(a)
>>> b
[0, 1, 2, [0, 1, 2, 3, 4]]
>>> c.extend(a)
>>> c
[0, 1, 0, 1, 2, 3, 4]

Так как list.extend() принимает произвольный итерируемый, вы также можете заменить

for line in mylog:
    list1.append(line)

по

list1.extend(mylog)

Ответ 2

Взгляните на itertools.chain за быстрый способ обработки многих небольших списков как одного большого списка (или, по крайней мере, как одного большой итерабельный) без копирования меньших списков:

>>> import itertools
>>> p = ['a', 'b', 'c']
>>> q = ['d', 'e', 'f']
>>> r = ['g', 'h', 'i']
>>> for x in itertools.chain(p, q, r):
        print x.upper()

Ответ 3

Это кажется довольно разумным для того, что вы пытаетесь сделать.

Несколько более короткая версия, которая опирается на Python, чтобы сделать большую часть тяжелого подъема, может быть:

for logs in mydir:

    for line in mylog:
        #...if the conditions are met
        list1.append(line)

    if any(True for line in list1 if "string" in line):
        list2.extend(list1)
    del list1

    ....

(True for line in list1 if "string" in line) выполняет итерацию по list и испускает True всякий раз, когда встречается совпадение. any() использует оценку короткого замыкания для возврата True, как только будет найден первый элемент True. list2.extend() добавляет содержимое list1 в конец.

Ответ 4

Использование встроенных функций map() и reduce()

def file_to_list(file):
     #stuff to parse file to a list
     return list

files = [...list of files...]

L = map(file_to_list, files)

flat_L = reduce(lambda x,y:x+y, L)

Минимальный "для циклизации" и элегантный шаблон кодирования:)

Ответ 5

Напомним предыдущие ответы. Если у вас есть список с [0,1,2] и еще один с [3,4,5] и вы хотите объединить их, чтобы он стал [0,1,2,3,4,5], вы можете или используйте chaining или extending и должны знать различия, чтобы использовать это с умом для ваших нужд.

Расширение списка

Используя метод extend классов list, вы можете копировать элементы из одного списка в другой. Однако это приведет к дополнительному использованию памяти, что в большинстве случаев должно быть хорошо, но может вызвать проблемы, если вы хотите эффективно использовать память.

a = [0,1,2]
b = [3,4,5]
a.extend(b)
>>[0,1,2,3,4,5]

enter image description here

Создание цепочки списка

itertools.chain вы можете использовать itertools.chain для itertools.chain многих списков, которые будут возвращать так называемый iterator который можно использовать для перебора списков. Это более эффективно использует память, поскольку не копирует элементы, а просто указывает на следующий список.

from itertools import chain
a = [0,1,2]
b = [3,4,5]
c = itertools.chain(a, b)

enter image description here

Создайте итератор, который возвращает элементы из первой итерации, пока она не будет исчерпана, затем переходит к следующей итерации, пока все итерации не будут исчерпаны. Используется для обработки последовательных последовательностей как единой последовательности.

Ответ 6

Если у нас есть список, как показано ниже:

list  = [2,2,3,4]

два способа скопировать его в другой список.

1.

x = [list]  # x =[] x.append(list) same 
print("length is {}".format(len(x)))
for i in x:
    print(i)
length is 1
[2, 2, 3, 4]

2.

x = [l for l in list]
print("length is {}".format(len(x)))
for i in x:
    print(i)
length is 4
2
2
3
4

Ответ 7

Вы также можете объединить два списка (скажем, a, b), используя оператор "+". Например,

a = [1,2,3,4]
b = [4,5,6,7]
c = a + b

Output:
>>> c
[1, 2, 3, 4, 4, 5, 6, 7]