2017-09-22 4 views
1

を複製し終わったときにユニークである必要はあり"_DUPLICATED_#NO"名などのユニークな何かをリネームするに頼ることなく、問題を複製し、そしてPythonの名前の変更は、反復数字が重複の数を表すと、好ましくは、この名前変更を解決するためにどのように

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) 

結果:

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

あなたが見ることができるように、名前は

答えて

4

一意ではありませんこれは、十分に単純なようです。あなたは、ファイル名のリストを開始します。

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

その後、あなたは重複が見つかった場合は1で末尾の番号をインクリメントし、ファイル名を終了するためにそれらを反復処理します。

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

これは、のような辞書を残す必要があります:あなたはその部分を削除することができ、重複した名前に原稿をマッピングする気にしない場合はもちろん

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

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

後でリストが必要な場合は、そのままキャストしてください。

final = list(result) 

ファイルを作成している場合、これはtempfileモジュールが行うように設計された、まさにであることに注意してください。

import tempfile 

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

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

これがうまくインクリメントファイル名を作成しませんが、彼らは独自の保証され、そしてNamedTemporaryFile.nameはあなたにファイル名を与えるもののfsは、(オープン)ファイルオブジェクトではなく、名前のリストのリストになります。

+2

@PRMoureuが修正されました。これは '['hello1'、 'hello1']'を '['hello1'、 'hello11​​']'に変換しますが、他のあまり明白でないエッジケースを壊さないように '['hello1'、 'hello2']'を生成します。 –

+1

これはうまくいきました、うまくいきましたが、使用していないと思われました> _ < – citizen2077

+1

@new_to_codingこれを使ってファイルを作成すると、編集をチェックアウトします。 –

関連する問題