Python, возвращающий значение внутри рекурсивного вызова функции - PullRequest
0 голосов
/ 08 сентября 2018

У меня есть некоторые данные, которые создают массив чисел. Иногда числа могут повторяться. Я хочу создать уникальное имя файла для каждого номера. Таким образом, я придумал хак, чтобы включить 2 цифры в конце каждого числа, и увеличивать его всякий раз, когда есть повтор

В некоторых случаях программа работает нормально и некоторое время не работает должным образом.

numbers = [10, 20, 30, 30, 40, 50, 50, 50, 50, 60]
filenames = []


def check_name(checkFileName):
    if checkFileName in filenames:
        checkFileName += 1
        check_name(checkFileName)
        return checkFileName

    else:
        print("Def-Filename :", checkFileName)
        return checkFileName


for number in numbers:
    stringNumber = str(number)
    tempFileName = stringNumber + "00"
    tempFileInt = int(tempFileName)

    permFileName = check_name(tempFileInt)
    filenames.append(permFileName)
    print("Permanent File Name :", permFileName)
    print(filenames)

А на выходе

Def-Filename : 1000
Permanent File Name : 1000
[1000]
Def-Filename : 2000
Permanent File Name : 2000
[1000, 2000]
Def-Filename : 3000
Permanent File Name : 3000
[1000, 2000, 3000]
Def-Filename : 3001
Permanent File Name : 3001
[1000, 2000, 3000, 3001]
Def-Filename : 4000
Permanent File Name : 4000
[1000, 2000, 3000, 3001, 4000]
Def-Filename : 5000
Permanent File Name : 5000
[1000, 2000, 3000, 3001, 4000, 5000]
Def-Filename : 5001
Permanent File Name : 5001
[1000, 2000, 3000, 3001, 4000, 5000, 5001]
Def-Filename : 5002
Permanent File Name : 5001
[1000, 2000, 3000, 3001, 4000, 5000, 5001, 5001]
Def-Filename : 5002
Permanent File Name : 5001
[1000, 2000, 3000, 3001, 4000, 5000, 5001, 5001, 5001]
Def-Filename : 6000
Permanent File Name : 6000
[1000, 2000, 3000, 3001, 4000, 5000, 5001, 5001, 5001, 6000]   

Где я иду не так?

1 Ответ

0 голосов
/ 08 сентября 2018

Проблема в том, что вы возвращаете имя файла, вычисленное функцией верхнего уровня, а не возвращаемое рекурсивным вызовом функции

Изменение

if checkFileName in filenames:
    checkFileName += 1
    check_name(checkFileName)
    return checkFileName

к этому

if checkFileName in filenames:
    checkFileName += 1
    return check_name(checkFileName)

При этом гораздо более простым решением является использование collections.Counter

>>> from collections import Counter
>>> numbers = [10, 20, 30, 30, 40, 50, 50, 50, 50, 60]
>>> 
>>> [n*100 + i for n,cnt in Counter(numbers).items() for i in range(cnt)]
[1000, 2000, 3000, 3001, 4000, 5000, 5001, 5002, 5003, 6000]
...