найти недостающее число от ALPHANUMERIC - Python - PullRequest
1 голос
/ 15 апреля 2009

Как мне написать функцию в 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

Ответы [ 2 ]

2 голосов
/ 15 апреля 2009

Вы можете подойти к этому как:

  1. Преобразовать имена файлов в соответствующие целые числа.
  2. Найдите пропущенные числа.
  3. Объедините пропущенные числа с шаблоном имени файла в качестве вывода.

Для (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 голос
/ 15 апреля 2009

Если предположить, что шаблоны относительно статичны, это достаточно легко с регулярным выражением:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...