查找以其他列表中的项目开头的列表

时间:2016-11-05 19:05:37

标签: python list

我有一系列包含整数的列表。我将它们存储在一个列表(列表列表)中,我称之为biglist。

然后我有第二个列表,例如[1,2]。

现在我想找到big_list中的所有列表,这些列表以与小列表相同的项目开头。我想要查找的列表必须至少包含第二个列表中的所有项目。

我认为这可以递归完成,并提出了这个工作示例:

def find_lists_starting_with(start, biglist, depth=0):
    if not biglist:  # biglist is empty
        return biglist

    try:
        new_big_list = []
        # try:
        for smallist in biglist:
            if smallist[depth] == start[depth]:
                if not len(start) > len(smallist):
                    new_big_list.append(smallist)

        new_big_list = find_lists_starting_with(start,
                                                new_big_list,
                                                depth=depth+1)
        return new_big_list
    except IndexError:
        return biglist

biglist = [[1,2,3], [2,3,4], [1,3,5], [1, 2], [1]]
start = [1, 2]

print(find_lists_starting_with(start, biglist))

但是我对代码示例不太满意。

您是否有如何改进的建议: - 代码的可理解性 - 效率

3 个答案:

答案 0 :(得分:4)

您可以通过迭代器尝试它,如下所示:

[x for x in big_list if x[:len(start_list)] == start_list]

答案 1 :(得分:1)

以下是我的写作方式:

def find_lists_starting_with(start, biglist):
    for small_list in biglist:
        if start == small_list[:len(start)]:
            yield small_list

这会返回一个生成器,但您可以调用list到其结果来获取列表。

答案 2 :(得分:0)

对于目前为止提出的两种解决方案(@mortezaipo,@ francisco-couzo)中的任何一种,可以通过自定义startswith方法提高空间效率,以避免在small_list[:len(start_list)]中构建新列表。例如:

def startswith(lst, start):
    for i in range(len(start)):
        if start[i] != lst[i]:
            return False
    return True

然后

[lst for lst in big_list if startswith(lst, start_list)]

(以@ mortezaipo的解决方案为模型)。