233 votes

Python: prendre le contenu d'une liste et de les ajouter à une autre liste

J'essaie de comprendre si le sens de prendre le contenu d'une liste et de les ajouter à une autre liste.

J'ai la première liste établie par le biais d'une fonction de boucle, qui vous permettra d'obtenir des lignes spécifiques d'un fichier et de les enregistrer dans une liste.

Puis une deuxième liste est utilisée pour enregistrer ces lignes, et commencer un nouveau cycle sur un autre fichier.

Mon idée était d'obtenir la liste une fois que le cycle est terminé, la déverser dans la deuxième liste, puis commencer un nouveau cycle, de vider le contenu de la première liste à nouveau dans la seconde, mais en ajoutant ce, la seconde liste sera la somme de tous les petits de la liste des fichiers créés dans ma boucle.

La liste doit être ajouter que si certaines conditions sont remplies, alors je vais juste ajouter que si les critères sont réunis.

Il ressemble à quelque chose de similaire à ceci:

# 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

N'cela a un sens, ou dois-je aller pour un itinéraire différent?

J'ai besoin de quelque chose d'efficace que de ne pas prendre trop grand nombre de cycles, depuis la liste des journaux est longue et chaque fichier texte est assez grand; alors j'ai pensé que les listes fit l'objet.

Merci pour toute suggestion!

Merci à vous deux, Kirk et Sven pour les solutions; je souhaite que je pourrais marquer à la fois avec la coche!

438voto

Sven Marnach Points 133943

Vous voulez probablement

list2.extend(list1)

au lieu de

list2.append(list1)

Voici la différence:

>>> 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]

Depuis list.extend() accepte l'arbitraire d'un objet iterable, vous pouvez également remplacer

for line in mylog:
    list1.append(line)

par

list1.extend(mylog)

14voto

Raymond Hettinger Points 50330

Jetez un oeil à itertools.chaîne pour un moyen rapide pour traiter de nombreuses petites listes comme une seule grande liste (ou au moins comme un seul grand objet iterable) sans copier les listes plus petites:

>>> 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()

3voto

Kirk Strauser Points 12087

Qui semble assez raisonnable pour ce que vous essayez de faire.

Une version légèrement plus courte, qui s'appuie sur le langage Python à faire plus que de soulever des poids lourds pourrait être:

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

    ....

L' (True for line in list1 if "string" in line) parcourt list et émet True chaque fois qu'une correspondance est trouvée. any() utilise évaluation de court-circuit de retour True dès la première True élément est trouvé. list2.extend() ajoute le contenu de list1 à la fin.

2voto

À l'aide de l' map() et reduce() fonctions intégrées

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)

Minimal "pour la lecture en boucle" et élégant modèle de codage :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X