如何在Python中编写函数来确定文件名列表是否与给定模式匹配以及该模式中缺少哪些文件?例如:
输入 - >
KUMAR.3.txt
KUMAR.4.txt
KUMAR.6.txt
KUMAR.7.txt
KUMAR.9.txt
KUMAR.10.txt
KUMAR.11.txt
KUMAR.13.txt
KUMAR.15.txt
KUMAR.16.txt
所需输出 - >
KUMAR.5.txt
KUMAR.8.txt
KUMAR.12.txt
KUMAR.14.txt
输入 - >
KUMAR3.txt
KUMAR4.txt
KUMAR6.txt
KUMAR7.txt
KUMAR9.txt
KUMAR10.txt
KUMAR11.txt
KUMAR13.txt
KUMAR15.txt
KUMAR16.txt
所需输出 - >
KUMAR5.txt
KUMAR8.txt
KUMAR12.txt
KUMAR14.txt
答案 0 :(得分:2)
您可以将其视为:
对于(1),如果文件结构是可预测的,那么这很容易。
def to_num(s, start=6):
return int(s[start:s.index('.txt')])
假设:
lst = ['KUMAR.3.txt', 'KUMAR.4.txt', 'KUMAR.6.txt', 'KUMAR.7.txt',
'KUMAR.9.txt', 'KUMAR.10.txt', 'KUMAR.11.txt', 'KUMAR.13.txt',
'KUMAR.15.txt', 'KUMAR.16.txt']
您可以通过以下方式获取已知号码列表:map(to_num, lst)
。当然,要寻找差距,你只需要最小和最大。将其与range
函数结合使用,即可得到您应该看到的所有数字,然后删除您已获得的数字。套装在这里很有帮助。
def find_gaps(int_list):
return sorted(set(range(min(int_list), max(int_list))) - set(int_list))
全部放在一起:
missing = find_gaps(map(to_num, lst))
for i in missing:
print 'KUMAR.%d.txt' % i
答案 1 :(得分:1)
假设模式是相对静态的,使用正则表达式很容易:
import re
inlist = "KUMAR.3.txt KUMAR.4.txt KUMAR.6.txt KUMAR.7.txt KUMAR.9.txt KUMAR.10.txt KUMAR.11.txt KUMAR.13.txt KUMAR.15.txt KUMAR.16.txt".split()
def get_count(s):
return int(re.match('.*\.(\d+)\..*', s).groups()[0])
mincount = get_count(inlist[0])
maxcount = get_count(inlist[-1])
values = set(map(get_count, inlist))
for ii in range (mincount, maxcount):
if ii not in values:
print 'KUMAR.%d.txt' % ii