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

时间:2013-12-31 17:31:45

标签: python list for-loop recursion dictionary

我有一个很有趣的问题,可以用“另辟蹊径”来回答。

我有一个函数,它使用for循环遍历列表。我在某些参数上调用该函数,并从它所处的位置继续遍历列表。问题是我希望能够跳出递归调用回顶部函数,但是跟踪我在列表中走了多远并从那里继续。

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

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}

如果这是有道理的。如果需要更多细节,请告诉我。

2 个答案:

答案 0 :(得分:2)

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

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迭代器不支持该位置。在这种情况下,您可以编写一个允许您取消消耗元素的迭代器,或者您可以使用显式索引进行迭代并将您停止的索引放入返回值。

答案 1 :(得分:0)

好像你是parsing输入列表。列表元素是标记和语法很简单,但语法分析最好用更多(递归)函数实现,具体取决于语法定义。

从您的示例中,BNF似乎是:

<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