for循环内部循环不在Python中工作

时间:2014-06-11 14:30:08

标签: python loops

我面临非常不寻常的问题,下面是pitnamebasename是2d列表的类中的代码 例如:=
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取决于我正在搜索的内容。实际上列表非常长。奇怪的是我注意到循环循环只到它循环到第一次的那个索引。就像这里第一次循环结束时,当它找到' a'并pitname成为' b'但是当它搜索' b'它循环直到它找到一个'只要。有谁知道它是怎么回事?

2 个答案:

答案 0 :(得分:0)

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

首先,更改您的' 2d'数组到dict

pitnamebasename = dict(pitnamebasename)

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

答案 1 :(得分:0)

您要求解决您的问题,但我无法复制问题。此代码执行相同的操作,而无需您更改整个类存储系统。

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

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