Estou tentando entender se faz sentido pegar o conteúdo de uma lista e anexá-lo a outra lista.
Eu tenho a primeira lista criada através de uma função de loop, que obterá linhas específicas de um arquivo e as salvará em uma lista.
Em seguida, uma segunda lista é usada para salvar essas linhas e iniciar um novo ciclo sobre outro arquivo.
Minha idéia era obter a lista assim que o ciclo for terminar, despejá-lo na segunda lista e iniciar um novo ciclo, despejar o conteúdo da primeira lista novamente na segunda, mas anexá-la, para que a segunda lista seja a soma de todos os arquivos de lista menores criados no meu loop. A lista deve ser anexada apenas se determinadas condições forem atendidas.
Parece algo semelhante a este:
# 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
Isso faz sentido ou devo seguir uma rota diferente?
Preciso de algo eficiente que não ocupe muitos ciclos, pois a lista de logs é longa e cada arquivo de texto é bastante grande; então pensei que as listas se encaixariam no objetivo.
Dê uma olhada no itertools.chain para uma maneira rápida de tratar muitas listas pequenas como uma única lista grande (ou pelo menos como uma única iterável grande) sem copiar as listas menores:
fonte
Isso parece bastante razoável para o que você está tentando fazer.
Uma versão ligeiramente mais curta, que se apóia no Python para fazer mais trabalho pesado, pode ser:
Ele
(True for line in list1 if "string" in line)
iteralist
e emiteTrue
sempre que uma correspondência é encontrada.any()
usa a avaliação de curto-circuito para retornarTrue
assim que o primeiroTrue
elemento for encontrado.list2.extend()
anexa o conteúdo delist1
até o final.fonte
any(True for line in list1 if "string" in line)
está escrito mais ordenadamente comoany("string" in line for line in list1)
.any
recebe um gerador; nenhuma lista de valores Verdadeiro ou Falso é construída em qualquer lugar. Minha versão retorna mais coisas paraany
verificar, mas em troca de não fazer a mesma verificação no próprio gerador. Eu imagino que é uma lavagem, mastimeit
é autoritário aqui, não eu. :)Você também pode combinar duas listas (digamos a, b) usando o operador '+'. Por exemplo,
fonte
Para recapitular as respostas anteriores. Se você tem uma lista com
[0,1,2]
e outra com[3,4,5]
e deseja mesclá-las, então ela se torna[0,1,2,3,4,5]
, você pode usarchaining
ouextending
e deve conhecer as diferenças para usá-la sabiamente para suas necessidades.Estendendo uma lista
Usando o método de
list
classesextend
, você pode fazer uma cópia dos elementos de uma lista para outra. No entanto, isso causará uso de memória extra, o que deve ser bom na maioria dos casos, mas pode causar problemas se você quiser ter eficiência de memória.Encadeando uma lista
Ao contrário, você pode usar
itertools.chain
para conectar muitas listas, que retornarão uma chamadaiterator
que pode ser usada para iterar nas listas. Isso é mais eficiente em termos de memória, pois não está copiando elementos, mas apenas apontando para a próxima lista.fonte
Usando as funções
map()
ereduce()
internasMínimo "para loop" e padrão de codificação elegante :)
fonte
Se tivermos lista como abaixo:
duas maneiras de copiá-lo para outra lista.
1
2)
fonte