Python: prenez le contenu d'une liste et ajoutez-le à une autre liste

J'essaie de comprendre s'il est logique de prendre le contenu d'une liste et de l'ajouter à une autre liste.

J'ai créé la première liste à travers une fonction de boucle, qui obtiendra des lignes spécifiques d'un fichier et les enregistrera 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 l'ajoutant, de sorte que la deuxième liste sera la somme de tous les fichiers de liste plus petits créés dans ma boucle. La liste ne doit être ajoutée que si certaines conditions sont remplies.

Cela 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

Est - ce logique ou devrais - je choisir un itinéraire différent?

J'ai besoin de quelque chose d'efficace qui ne prendrait pas trop de cycles, car la liste des journaux est longue et chaque fichier texte est assez gros; donc j'ai pensé que le les listes correspondraient à l'objectif.

136
demandé sur MERose 2011-11-18 06:31:23

6 réponses

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]

Puisque list.extend() accepte un itérable arbitraire, vous pouvez également remplacer

for line in mylog:
    list1.append(line)

Par

list1.extend(mylog)
252
répondu Sven Marnach 2011-11-18 02:34:36

Jetez un oeil à itertools.chaîne pour un moyen rapide de traiter de nombreuses petites listes comme une seule grande liste (ou au moins comme une seule grande itérable) sans copier les petites listes:

>>> 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()
9
répondu Raymond Hettinger 2011-11-18 02:36:57

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

Une version légèrement plus courte qui s'appuie sur Python pour faire plus de levage lourd 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

    ....

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

3
répondu Kirk Strauser 2011-11-18 02:41:00

En utilisant les fonctions map() et reduce() 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 boucler" et modèle de codage élégant:)

2
répondu pX0r 2014-10-31 08:32:16

Pour récapituler les réponses précédentes. Si vous avez une liste avec [0,1,2] et une autre avec [3,4,5] et que vous souhaitez les fusionner, de sorte qu'il devient [0,1,2,3,4,5], vous pouvez utiliser chaining ou extending et doivent connaître les différences à l'utiliser à bon escient pour vos besoins.

Extension d'une liste

En utilisant la méthode list classes extend, Vous pouvez faire une copie des éléments d'une liste sur une autre. Cependant, cela entraînera une utilisation supplémentaire de la mémoire, ce qui devrait être correct dans la plupart des cas, mais pourrait causer des problèmes si vous voulez être efficace en terme de mémoire.

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

entrez la description de l'image ici

Enchaîner une liste

Au contraire, vous pouvez utiliser itertools.chain pour câbler de nombreuses listes, ce qui renverra un iterator qui peut être utilisé pour parcourir les listes. C'est plus efficace en mémoire car il ne copie pas d'éléments mais pointe simplement vers la liste suivante.

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

entrez la description de l'image ici

Créez un itérateur qui renvoie les éléments du premier itérable jusqu'à ce qu'il soit épuisé, puis passe à l'itérable suivant, jusqu'à ce que tous les itérables soient épuisés. Utilisé pour traiter des séquences consécutives comme une seule séquence.

1
répondu user1767754 2018-01-18 07:33:20

Si nous avons la liste comme ci-dessous:

list  = [2,2,3,4]

Deux façons de le copier dans une autre liste.

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
0
répondu Avi 2018-02-09 03:11:00