【问题标题】:Python renaming duplicatesPython重命名重复项
【发布时间】:2018-03-04 11:56:06
【问题描述】:

如何解决这个重命名重复问题,而无需使用像 "_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']

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

【问题讨论】:

    标签: python list duplicates rename


    【解决方案1】:

    这看起来很简单。您从文件名列表开始:

    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 会给你文件名。

    【讨论】:

    • @PRMoureu 已修复。哎呀,算法很难;)这将把['hello1', 'hello1']变成['hello1', 'hello11'],但我想不出一个很好的方法来概括一个可以产生['hello1', 'hello2']的解决方案,而不会破坏其他不太明显的边缘情况。
    • 这个不错,干得好,没想到用while >_
    • @new_to_coding 如果您使用它来创建文件,请查看我的编辑。
    • 另外'hello1' > 'hello11'是我认为的正确方式,更改输入单词会很奇怪,目标是避免重复
    猜你喜欢
    • 2021-04-17
    • 2020-06-17
    • 2019-04-27
    • 2021-11-02
    • 1970-01-01
    • 2021-04-29
    • 2016-02-29
    • 1970-01-01
    • 2018-05-08
    相关资源
    最近更新 更多