我有一系列包含整数的列表。我将它们存储在一个列表(列表列表)中,我称之为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))
但是我对代码示例不太满意。
您是否有如何改进的建议: - 代码的可理解性 - 效率
答案 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的解决方案为模型)。