在Python中通过函数内部完成的列表跟踪迭代

在Python中通过函数内部完成的列表跟踪迭代,python,list,for-loop,recursion,dictionary,Python,List,For Loop,Recursion,Dictionary,我有一个有趣的问题,很可能会用“用另一种方式做”来回答 我有一个函数,它使用for循环遍历列表。我在某些参数上调用函数本身,并从它所在的位置开始不断迭代列表。问题是我希望能够跳出递归调用返回top函数,但要跟踪我在列表中的位置,并从那里继续下去 基本上我想要这样的东西: def iterate_list(listA) dictA = {} for pos,item in enumerate(listA): if item == 1: dic

我有一个有趣的问题,很可能会用“用另一种方式做”来回答

我有一个函数,它使用for循环遍历列表。我在某些参数上调用函数本身,并从它所在的位置开始不断迭代列表。问题是我希望能够跳出递归调用返回top函数,但要跟踪我在列表中的位置,并从那里继续下去

基本上我想要这样的东西:

def iterate_list(listA)
    dictA = {}
    for pos,item in enumerate(listA):
        if item == 1:
            dictA[pos] = iterate_list(listA[pos])
            #At this point I want to go back to for loop (like continue does) except I want 
            #to be at the pos I was at when I left the sub function
            continue #? Don't think continue is what I want but its the closest thing I could 
            #find so I left it in for now
        elif item == 2:
            return dictA
        else:
            dictA[pos] = item
    return dictA

dictFinal = iterate_list(original_list)
因此,最终的结果是列表中所有内容的字典(本例中为整数,但并不总是),除了一些关键点指向子字典时的点。这是一个简化版本的代码,我去掉了所有额外的代码来获取键和值(我对它进行了广泛的测试),所以我在字典里放的东西看起来有点傻(但模拟了我做得足够好的东西)。谢谢你的帮助

编辑:根据要求对输入和输出进行更详细的说明。输入是一个字符串列表,这些字符串大多以word:word的形式编写,输出是第一个单词作为键,第二个单词作为字典的值。字符串代码的解析是编写并运行的。但是有一些重复键的区域,所以我想把它们放到子字典中。比如说

Input = [Name: Bob, ID: 12345, Age: 99, Job: Dentist, Patient Name: John, Patient ID: 321, Patient Name: Susan, Patient ID: 666, Patient Name: Lucy, Patient ID: 087, Employees: 5, Address: 233 Main St, Phone: 555-5555]

Output = {Name : Bob, ID : 12345, Age : 99, Job : Dentist, Patient1 : {Patient Name : John, Patient ID : 321}, Patient2 : {Patient Name : Susan, Patient ID : 666}, Patient3 : {Patient Name : Lucy, Patient ID : 087}, Employees : 5, Address : 233 Main St, Phone : 555-5555}
如果这有道理的话。如果需要更多详细信息,请告诉我。

您似乎正在输入列表。列表元素是标记,语法很简单,但语法分析最好使用更多(递归)函数来实现,具体取决于语法定义

从你的例子来看,似乎是:

<patient>       ::= <patient-id> <patient-name>  # Patient has 2 fields
<doctor-data>   ::= Name | ID | Age | Job        # Personal doctor data is combination of these data
<doctor>        ::= <doctor-data> <patient>*     # Doctor data is personal data and some patients
<hospital_data> ::= Employees | Address | Phone  # Hospital data fields
<hospital>      ::= <doctor>* <hospital_data>    # Hospital has doctors and additional data
::=#患者有2个字段
::=姓名| ID |年龄|工作#个人医生数据是这些数据的组合
::=*#医生数据是个人数据和一些患者的数据
::=员工|地址|电话#医院数据字段
::=*#医院有医生和其他数据

一个简单的答案是使用迭代器。如果您将迭代器传递给递归调用,并且它使用了一些元素,那么当递归调用返回时,您将继续它停止的位置:

def function(iterable):
    iterable = iter(iterable):
    for thing in iterable:
        if some_condition(thing):
            function(iterable)
            continue
            # The next iteration of the loop will use
            # the first item the recursive call didn't.

不过,这可能无法解决问题;例如,您可能需要返回列表中的一两个位置,而大多数Python迭代器不支持这一点。在这种情况下,您可以编写一个迭代器,允许您取消使用元素,或者您可以使用显式索引进行迭代,并将停止的索引放入返回值。

您只需将变量存储在全局范围内,并在函数内访问它即可。这样,每次完成函数后就不会浪费它。您可以输入/输出示例吗?尝试使用break关键字而不是continue。Break将退出forloop,递归函数将返回上一个。continue关键字跳过循环的当前迭代并继续下一次迭代。@Christian更新了帖子。@ConorPatrick我不一定要退出for循环,我只想跳过前面的X次迭代,其中X是我在子函数中经过的迭代次数。如果我突破了,那么一旦我达到了最高水平,我就会退出。这似乎正是我所期待的,完美的工作。我已经得到了一个“可用”的设置,在那里我强制迭代通过循环到达我需要的地方,但这种方式更干净(我想更有效,尽管我不确定)。谢谢