For循环在内部,而循环在Python中不工作

2024-03-29 13:40:05 发布

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

我遇到了一个非常不寻常的问题,下面是一个类中的代码,其中pitnamebasename是2d list。
例如:=
pitnamebasename= [['a','b'],['n','m'],['b','c'],['m','f'],['c','d'],['d',''],['h','f']]
上面的列表不必按任何顺序排列,例如['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'。有人知道这是怎么发生的吗?在


Tags: and函数代码selftrue列表for顺序
2条回答

你要求解决你的问题,但我很难复制这个问题。此代码执行相同的操作,而不需要更改整个类存储系统。在

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

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'}

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

^{pr2}$
pitnamebasename= [['a','b'],['n','m'],['b','c'],['m','f'],['c','d'],['d',''],['h','f']]

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

^{pr2}$

现在,只需简单地从一个元素遍历到另一个元素,使用与当前键关联的值作为下一个键,直到该值为空字符串;然后 返回当前密钥。如果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

相关问题 更多 >