动态搜索python列表

时间:2016-05-14 15:10:09

标签: python list search

我希望巩固一个我知道可以改进的功能。

我添加了一系列全局列表,并定期添加列表数量。

在此功能中,我可以搜索输入字符并返回列表中的列表编号和位置。不幸的是,每次添加新列表时,我都必须使用新列表名称添加新的嵌套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)

4 个答案:

答案 0 :(得分:0)

如果您只是想避免嵌套,请使用早期的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 - 循环。

答案 1 :(得分:0)

在澄清之后进行修改 - 因此您愿意在搜索之前指定固定数量的列表:

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函数的危险,但在这种情况下,假设它是你的代码,你应该没问题。

答案 2 :(得分:0)

您实际上想要搜索列表列表。所以你应该列出一个列表,而不是在变量名上使用后缀。

因此,这些方面的内容应符合您的需求:

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()等等)

通常,如果您认为自己拥有相同类型的许多内容,则应使用列表。将变量名称后缀化为代码气味。

答案 3 :(得分:0)

我会做这样的事情:

list1= ["foo"];
list2= ["foo"];
list3= ["foo"];
list4= ["foo", "baz"];

def findInLists(inputString):
    lists = [list1, list2, list3, list4];
    output = -1;
    for i, each in enumerate(lists):
        try:
            output = each.index(inputString)
            break
        except ValueError:
            pass
    return str(i+1) + str(output)

尝试一下:https://repl.it/CQn3/3