[英]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.