2017-09-22 2 views
1

Comment résoudre ce changement de nom de dupliquer problème sans avoir recours à renommer avec quelque chose d'unique comme "_DUPLICATED_#NO" les noms doivent être uniques lorsque vous avez terminé, et de préférence avec des nombres itératives indiquant nombre de doublonschangement de nom Python doublons

from collections import defaultdict 

l = ["hello1","hello2","hello3", 
    "hello","hello","hello"] 

tally = defaultdict(lambda:-1) 
for i in range(len(l)): 
    e = l[i] 
    tally[e] += 1 
    if tally[e] > 0: 
     e += str(tally[e]) 
    l[i] = e 
print (l) 

résultats:

['hello1', 'hello2', 'hello3', 'hello', 'hello1', 'hello2'] 

comme vous pouvez le voir, les noms ne sont pas uniques

Répondre

4

Cela semble assez simple. Vous commencez avec une liste de noms:

l = ["hello1","hello2","hello3", 
    "hello","hello","hello"] 

Ensuite, vous itérer les finis noms de fichiers, incrémenter un numéro de fin de 1 si un double est trouvé.

result = {} 
for fname in l: 
    orig = fname 
    i=1 
    while fname in result: 
     fname = orig + str(i) 
     i += 1 
    result[fname] = orig 

Cela devrait vous laisser avec un dictionnaire comme:

{"hello1": "hello1", 
"hello2": "hello2", 
"hello3": "hello3", 
"hello": "hello", 
"hello4": "hello", 
"hello5": "hello"} 

Bien sûr, si vous ne se soucient pas de cartographier les originaux aux noms en double, vous pouvez déposer cette partie.

result = set() 
for fname in l: 
    orig = fname 
    i=1 
    while fname in result: 
     fname = orig + str(i) 
     i += 1 
    result.add(fname) 

Si vous souhaitez une liste par la suite, transformez-la comme ça.

final = list(result) 

Notez que si vous créez des fichiers, c'est exactement ce que le module tempfile est conçu pour faire.

import tempfile 

l = ["hello1","hello2","hello3", 
    "hello","hello","hello"] 

fs = [tempfile.NamedTemporaryFile(prefix=fname, delete=False, dir="/some/directory/") for fname in l] 

Cela ne crée pas bien les noms de fichiers incrémenter, mais ils sont garantis unique et fs sera une liste des objets de fichier (ouvert) plutôt que d'une liste de noms, bien que NamedTemporaryFile.name vous donnera le nom du fichier.

+2

@PRMoureu fixe. Oups, les algorithmes sont durs;) Cela va activer '['bonjour1', 'bonjour1']' dans '['bonjour1', 'bonjour11']', mais je ne peux pas penser à un excellent moyen de généraliser une solution qui serait produire '['bonjour1', 'bonjour2']' d'une manière qui ne briserait pas d'autres cas de bords moins évidents. –

+1

c'est bien, bien fait, n'a pas pensé à utiliser alors que _ _ – citizen2077

+1

@new_to_coding vérifier ma modification si vous utilisez ceci pour créer des fichiers. –