Python:double-for循环下递归的逻辑错误

2024-04-29 12:43:51 发布

您现在位置:Python中文网/ 问答频道 /正文

背景

我正在做一个项目,需要比较一组字符串,只保留uniquedistinct的字符串。 Uniqdistinct表示不应该有两个字符串,
A) 回文,例如ABA' , 'BCB'
B) Reverse of each other. e.g.
'ABCD'and 'DCBA' C) Same as each other, e.g.'ABC'and'ABC'`

如果列表中确实包含这样的属性,那么程序应该只保留其中一个属性并删除其他属性。你知道吗

例如,我正在使用itertoolspermutations以及combination模块生成如下列表,
aList= ['ABC', 'ACB', 'BAC', 'BCA', 'CAB', 'CBA', 'ABC']

并通过两个for循环进行处理。
Outer for循环从头到尾处理每个数字,直到命中End of List -1项。
内部for循环处理从start + 1项到End of List。 这样,两个循环总是比较两个不同的字符串。你知道吗

现在,需要使用Recursions来完成这个逻辑

什么有效

我确实编写了以下程序,每次找到属性并删除重复项时都调用递归函数。你知道吗

什么不起作用

只有当列表中至少有一个项与属性条件匹配并被删除时,递归才起作用。当saveFound = True。我还使用了另一个变量来跟踪使用found = True的部分查找,但还没有完全实现。你知道吗

当列表中没有与特定项匹配的属性时,程序将失败。然而,我们并没有完成,直到所有的项目被检查,我们在列表中的最后两个项目。然后我们离开。你知道吗

我需要什么帮助

我添加了额外的print语句(以#debug结尾),以查看要替换的项。 我需要知道如何在程序中使用递归函数来修复第一项没有重复项的情况。程序正在进行自我比较并将自己从列表中删除。 在这种情况下,它似乎没有到达外部for循环。 任何输入/修复都是值得赞赏的。你知道吗

程序:

from itertools import combinations, permutations

""" Process list to generate Unique strings matching given criteria """
def uniqLst(aList):

    """ Iterate through outer loop to compare each string until End of Loop """
    firstItem = 0
    lastItem = len(aList) -1
    for item1 in aList[firstItem:lastItem:]:

        saveFound = False
        print "Starting Next for Loop : Loop Length", len(aList) #Debug Data
        print "input List=", aList #Debug Data

        for item2 in aList[firstItem + 1:lastItem + 1:]:
            #Compare first item with next
            print "Comparing item1, item2 =", item1 , item2 #Debug Data

            """ Check if second string is reverse / palindrome or same """      
            if  item1[::-1] == item2 or item1 == item2:
                found = True
                saveFound = True
                print "Removing", item2 #Debug Data
                aList.remove(item2) # Remove second item matching criteria
            else:
                found = False

        """One iteration cycle is complete"""
        if saveFound == True:
            print "Starting Next Iteration" #Debug Data
            uniqLst(aList)              #Force load of new aList

    #External loop is complete exit Function
    return aList


""" Main Function """    
if __name__== "__main__":

    tmpLst1 = ["".join(x) for x in permutations('ABC', 3)]
    tmpLst2 = ["".join(x) for x in combinations('ABC', 3)]

    checkStrLst = tmpLst1 + tmpLst2

    finalList =  uniqLst(checkStrLst)
    print "========================"
    print "finalList", finalList

输出

Python 2.7.9 (default, Dec 10 2014, 12:24:55) [MSC v.1500 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> ================================ RESTART ================================
>>> 
Starting Next for Loop : Loop Length 7
input List= ['ABC', 'ACB', 'BAC', 'BCA', 'CAB', 'CBA', 'ABC']
Comparing item1, item2 = ABC ACB
Comparing item1, item2 = ABC BAC
Comparing item1, item2 = ABC BCA
Comparing item1, item2 = ABC CAB
Comparing item1, item2 = ABC CBA
Removing CBA
Comparing item1, item2 = ABC ABC
Removing ABC
Starting Next Iteration
Starting Next for Loop : Loop Length 5
input List= ['ACB', 'BAC', 'BCA', 'CAB', 'ABC']
Comparing item1, item2 = ACB BAC
Comparing item1, item2 = ACB BCA
Removing BCA
Comparing item1, item2 = ACB CAB
Comparing item1, item2 = ACB ABC
Starting Next Iteration
Starting Next for Loop : Loop Length 4
input List= ['ACB', 'BAC', 'CAB', 'ABC']
Comparing item1, item2 = ACB BAC
Comparing item1, item2 = ACB CAB
Comparing item1, item2 = ACB ABC
Starting Next for Loop : Loop Length 4
input List= ['ACB', 'BAC', 'CAB', 'ABC']
Comparing item1, item2 = BAC BAC
Removing BAC
Comparing item1, item2 = BAC CAB
Removing CAB
Comparing item1, item2 = BAC ABC
Starting Next Iteration
Starting Next for Loop : Loop Length 2
input List= ['ACB', 'ABC']
Comparing item1, item2 = ACB ABC
Starting Next for Loop : Loop Length 2
input List= ['ACB', 'ABC']
Comparing item1, item2 = CAB ABC
Starting Next for Loop : Loop Length 2
input List= ['ACB', 'ABC']
Comparing item1, item2 = BAC ABC
Starting Next for Loop : Loop Length 2
input List= ['ACB', 'ABC']
Comparing item1, item2 = BCA ABC
Starting Next for Loop : Loop Length 2
input List= ['ACB', 'ABC']
Comparing item1, item2 = CAB ABC
Starting Next for Loop : Loop Length 2
input List= ['ACB', 'ABC']
Comparing item1, item2 = ACB ABC
Starting Next for Loop : Loop Length 2
input List= ['ACB', 'ABC']
Comparing item1, item2 = BAC ABC
Starting Next for Loop : Loop Length 2
input List= ['ACB', 'ABC']
Comparing item1, item2 = BCA ABC
Starting Next for Loop : Loop Length 2
input List= ['ACB', 'ABC']
Comparing item1, item2 = CAB ABC
Starting Next for Loop : Loop Length 2
input List= ['ACB', 'ABC']
Comparing item1, item2 = CBA ABC
Removing ABC
Starting Next Iteration
========================
finalList ['ACB']
>>> 

Tags: loopforinputlengthlistnextabcstarting
1条回答
网友
1楼 · 发布于 2024-04-29 12:43:51

好的,所以我试着让你的代码工作,同时尽可能少的改变。底线是,我不认为你不改变你的列表就可以逃脱,因为你必须在每个递归步骤中以某种方式跟踪你的状态。你知道吗

from itertools import combinations, permutations

""" Process list to generate Unique strings matching given criteria """
def uniqLst(aList, finalList):

    """ Iterate through outer loop to compare each string until End of Loop """

    # Terminate if length is 0
    if(len(aList) == 0):
        return

    # Initialize local values
    found = False
    item1 = aList[0];

    # Go through list and compare with first item
    for item2 in aList[1:len(aList)]:

        """ Check if second string is reverse / palindrome or same """
        if item1[::-1] == item2 or item1 == item2:
            found = True
            print "Removing", item2 #Debug Data
            aList.remove(item2) # Remove second item matching criteria

    # If no item matches, add first item to final list
    if found != True:
        temp = aList.pop(0)
        finalList.append(temp)

        # Recursively call this function with updated aList
    uniqLst(aList, finalList)

    return


""" Main Function """
if __name__== "__main__":

    tmpLst1 = ["".join(x) for x in permutations('ABC', 3)]
    tmpLst2 = ["".join(x) for x in combinations('ABC', 3)]

    checkStrLst = tmpLst1 + tmpLst2

    finalList = []
    uniqLst(checkStrLst, finalList)
    print "========================"
    print "finalList", finalList

我添加了一些注释,以帮助您了解我在每一步中所做的工作。 如果这不符合你的要求,请告诉我!你知道吗

相关问题 更多 >