我希望巩固一个我知道可以改进的功能。
我有一系列的全局列表,我会添加这些列表,并定期添加列表的数量。
在这个函数中,我可以搜索输入字符并返回列表中的列表号和位置。不幸的是,每次我添加一个新列表时,我还必须添加一个新的嵌套try /except ValueError,并使用新的列表名。
我确信,比我更有编码经验的人可以想出一种方法来递归调用这个函数并进行搜索,而无需嵌套这些函数。理想情况下,我想我应该指定多少个"Listx“列表来使用接受字符串和整数的函数进行搜索?
def findInLists(inputString):
line = 0
output = 0
try:
output = List1.index(inputString)
except ValueError:
line += 1
try:
output = List2.index(inputString)
except ValueError:
line += 1
try:
output = List3.index(inputString)
except ValueError:
line += 1
try:
output = List4.index(inputString)
except ValueError:
output = -1
return str(line) + str(output)
发布于 2016-05-14 07:34:47
在澄清之后进行修改--因此,您愿意在搜索之前指定固定数量的列表:
def _search_lists(phrase,numb_of_lists):
for n in range(1, numb_of_lists + 1):
list_name = "list" + str(n)
list_to_search = eval(list_name)
if search phrase in list_to_search:
return n, list_to_search.index(search_phrase)
return 0,0
返回的是列表号和索引位置,如果不在任何列表中,则为(0,0)
注意,许多人警告说使用eval函数的危险,但在这种情况下,假设它是您的代码,您应该是好的。
发布于 2016-05-14 07:32:59
如果您只想避免嵌套,请使用早期的return
:
def findInLists(inputString):
line = 0
output = 0
try:
output = List1.index(inputString)
return str(line) + str(output)
except ValueError:
line += 1
try:
output = List2.index(inputString)
return str(line) + str(output)
except ValueError:
line += 1
try:
output = List3.index(inputString)
return str(line) + str(output)
except ValueError:
line += 1
try:
output = List4.index(inputString)
return str(line) + str(output)
except ValueError:
output = -1
return str(line) + str(output)
现在这仍然是很多重复的逻辑,不是吗?但现在更容易将其重构为for
-loop。
发布于 2016-05-14 07:36:11
你实际上想要搜索一个列表。因此,您应该列出一个列表,而不是在变量名称上使用后缀。
因此,这样的东西应该适合你的需要:
def find_it(lists, val):
idxVal = -1
idxList = -1
for l in lists:
try:
f = l.index(val)
except:
pass
return idxList, idxVal
listIndex, valueIndex = find_it([List1, List2, List3], "foo")
当然,这只是许多可能的解决方案中的一种(您可以递归地、尾优先、使用reduce()
等等)。
一般来说,如果你觉得你有很多相同类型的东西,你应该使用列表。在变量名后缀是一种代码气味。
https://stackoverflow.com/questions/37228300
复制相似问题