我面临非常不寻常的问题,下面是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'它循环直到它找到一个'只要。有谁知道它是怎么回事?
答案 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