优雅与优雅短(pythonic)方式找到最低的未使用数字

时间:2016-02-22 07:41:16

标签: python

假设我正在编写名为foo.001的文件,但001被基于真正存在的文件的最低免费索引所取代。写这个最优雅的方式是什么?这是我使用的东西,但它看起来不太好,是吗?

base='foo'
i=0
while True:
    i+=1; name=base+'.%03d'%i
    if not os.path.exists(name): break
# use name here

最好的建议是最受欢迎的。

编辑:查找不会并行运行,而且我需要最低的未使用索引(并行查找并不总是给出最低的索引)。还假设我不能列出已经使用的所有名称,只测试是否存在(我不仅要将其用于文件,而且通常使用命名对象,并且列表并不总是可行或有效)。

3 个答案:

答案 0 :(得分:3)

相同数量的陈述,但可能稍微更具可读性。使用itertools.count

from itertools import count

def next_available(base):
    for ext in count(start=1):
        name = '{}.{:03d}'.format(base, ext)
        if not os.path.exists(name):
            return name

答案 1 :(得分:1)

import glob

used_filenames = {name:True for name in glob.glob('foo.[0-9][0-9][0-9]'))}

for i in range(1000):
    prospect = "foo.{:03d}".format(i)
    if prospect not in used_filenames:
        print("The next unused filename is", prospect)
        break

答案 2 :(得分:0)

这是一个建议:

import os
path = '/home/mydir'
existingnumbers = [int(entry.split('.')[1]) for entry in os.listdir(path) if 'foo.' in entry]
potentialnumbers = range(len(existingnumbers)+1)
newfile = 'foo.{0}'.format(min(set(potentialnumbers) - set(existingnumbers)))