Python重命名重复

时间:2017-09-22 20:14:25

标签: python list duplicates rename

如何解决此重命名重复问题,而无需使用像"_DUPLICATED_#NO"之类的独特内容重命名,这些名称在完成后必须是唯一的,并且最好使用表示重复数量的迭代数字

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

如您所见,名称不是唯一的

1 个答案:

答案 0 :(得分: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]

这不会创建很好的递增文件名,但它们保证唯一,fs将是(打开)文件对象的列表而不是名称列表,尽管NamedTemporaryFile.name会给你文件名。