繁体   English   中英

for循环中while循环在Python中不起作用

[英]For loop inside while loop not working in Python

我面临一个非常不寻常的问题,下面是pitnamebasename是2d列表的类中的代码。
例如:=
pitnamebasename= [['a','b'],['n','m'],['b','c'],['m','f'],['c','d'],['d',''],['h','f']]
上面的列表不需要以['d','']任何顺序排列['d','']可以以0的顺序排列。

这是我的功能(在类中):

   def getRole(self,pitname):
            basename=pitname
            print '\n\n\nbasename=',basename
            ind=True
            while pitname and ind:
                    ind=False
                    basename=pitname
                    print 'basename=',basename
                    for i in self.pitnamebasename:
                            print 'comparing-',i[0],'and',pitname
                            if i[0] == pitname:
                                    pitname=i[1]
                                    print 'newpitname=',pitname
                                    ind=True
                                    break
            print 'returning-',basename
            return basename

pitname是字符串,例如,此处可以是“ a”。 我希望返回值是“ d”,意味着遍历必须像a到b,b到c以及d到None一样,因此返回值必须是d。 请不要建议我其他解决方法。
现在我的问题是,在for循环中,它直到最后都没有循环,而是从中间退出。 就像返回值是b还是c甚至d取决于我要搜索的内容。 实际上列表很长。 奇怪的是,我注意到for循环仅循环到该索引直到第一次循环。 像这里一样,第一次for循环在找到'a'并且pitname变成'b'时结束,但是在搜索'b'时循环直到找到'a'。 有谁知道这是怎么回事?

pitnamebasename= [['a','b'],['n','m'],['b','c'],['m','f'],['c','d'],['d',''],['h','f']]

首先,将您的“ 2d”数组更改为dict

pitnamebasename = dict(pitnamebasename)

现在,只需将与当前键关联的值用作下一个键,从一个元素到另一个元素,直到该值为空字符串为止,这很简单。 然后返回当前密钥。 如果pitname曾经pitname作为键存在,则将其视为确实存在并映射到空字符串。

def getRole(self, pitname):
    while pitnamebasename.get('pitname', '') != '':
        pitname = pitnamebasename[pitname]
    return pitname

在这种情况下,也可以使用defaultdict

import collections.defaultdict
pitnamebasename = defaultdict(str, pitnamebasename)
def getRole(self, pitname):
    while pitnamebasename[pitname] != '':
        pitname = pitnamebasename[pitname]
    return pitname

您要求问题的解决方案,但我在复制问题上遇到困难。 该代码执行相同的操作,而无需您更改整个类存储系统。

通过将列表列表转换为字典查找(如下所示)

as_list_of_lists = [['a','b'],['n','m'],['b','c'],['m','f'],['c','d'],['d',''],['h','f']]
as_dict = dict(as_list_of_lists)
# as_dict = {'a': 'b', 'c': 'd', 'b': 'c', 'd': '', 'h': 'f', 'm': 'f', 'n': 'm'}

我们可以使用字典方法.get进行默认的字典查找。 这将查找一个项目(例如,我们将其传递给“ a”)并返回关联的值(“ b”)。 如果我们查找字典中没有的内容,.get将返回第二个值(默认值),我们可以将其提供为“”。 因此as_dict.get('z','')将返回''

class this_class
    def __init__(self):
        self.pitnamebasename= [['a','b'],['n','m'],['b','c'],['m','f'],['c','d'],['d',''],['h','f']]

    def getRole(self,pitname):
        lookup = dict(self.pitnamebasename)
        new_pitname = pitname
        while new_pitname != '':
            pitname = new_pitname
            new_pitname = lookup.get(pitname, '')
        return pitname

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM