在Python中通过函数内部完成的列表跟踪迭代
我有一个有趣的问题,很可能会用“用另一种方式做”来回答 我有一个函数,它使用for循环遍历列表。我在某些参数上调用函数本身,并从它所在的位置开始不断迭代列表。问题是我希望能够跳出递归调用返回top函数,但要跟踪我在列表中的位置,并从那里继续下去 基本上我想要这样的东西:在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
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是我在子函数中经过的迭代次数。如果我突破了,那么一旦我达到了最高水平,我就会退出。这似乎正是我所期待的,完美的工作。我已经得到了一个“可用”的设置,在那里我强制迭代通过循环到达我需要的地方,但这种方式更干净(我想更有效,尽管我不确定)。谢谢