簡體   English   中英

Python在函數的遞歸調用中返回值

[英]Python returning value inside recursive call of a function

我有一些數據可以創建一個數字數組。 有時可能會重復這些數字。 我想為每個數字創建一個唯一的文件名。 所以我想出了一個黑客,在每個數字的末尾包含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]   

我哪里錯了?

問題是您返回的是頂級函數計算的文件名,而不是遞歸函數調用返回的文件名

更改

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]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM