2010-10-08 4 views
2

Quel est le moyen le plus rapide de prendre une liste de fichiers et le nom d'un fichier de sortie et de les fusionner en un seul fichier tout en supprimant les lignes en double? quelque chose commeQuel est le moyen le plus rapide de fusionner des fichiers et quelle est la manière la plus rapide de diviser un tableau?

cat fichier1 fichier2 fichier3 | sort -u> out.file

en python. Préférez ne pas utiliser les appels système.

ET:

ce qui est le meilleur moyen de diviser une liste en python en morceaux X (liste des listes) aussi égaux que possible? (Donné une liste et X.)

+0

les morceaux doivent maintenir l'ordre dans la liste initiale. égal ici se réfère à la taille. alors LIST = (x1, x2, x3, x4) est divisé en ((x1, x2), (x3, x4)) pour X = 2. – cokacola

+0

Par le plus rapide, voulez-vous dire le plus rapide à écrire ou le plus rapide à exécuter? Aussi, voulez-vous conserver l'ordre des lignes? – JoshD

+3

Vous devriez diviser cette question en deux - les choses que vous demandez ne sont pas liées les unes aux autres et doivent être séparées. –

Répondre

-1

Pour la première:

lines = [] 
for filename in filenames: 
    f = open(filename) 
    lines.extend(f.read().split('\n') 
    f.close() 
lines = list(set(lines)) #remove duplicates 
f = open(outfile_name, 'w') 
f.write(''.join(lines)) 

en supposant que les fichiers sont une longueur raisonnable que toutes les données des fichiers seront stockés dans la mémoire en même temps. Si vous souhaitez conserver l'effet secondaire de sort en ordonnant les lignes, il suffit d'ajouter lines.sort() avant que le fichier ne soit écrit.

Et la seconde:

step_size = len(orig_list)/num_chunks 
split_list = [orig_list[i:i+step_size] for i in range(0, len(orig_list), step_size)] 
2

Première:

lines = set() 
for filename in filenames: 
    with open(filename) as inF: 
     lines.update(inF) 
with open(outfile, 'w') as outF: 
    outF.write(''.join(lines)) 

Deuxième:

def chunk(bigList, x): 
    chunklen = len(bigList)/x 
    for i in xrange(0, len(bigList), chunklen): 
     yield bigList[i:i+chunklen] 

listOfLists = list(chunk(bigList, x)) 
Questions connexes