Python - 检查元素是否在 1 个或多个嵌套列表中,如果为 TRUE,则 return 整个列表

Python - Check if element is in 1 or more nested lists and return whole list if TRUE

在此先感谢您的帮助。

我有一个嵌套的 list/list 列表,我需要 return 仅当列表包含特定元素时才将每个列表显示到屏幕上。

榜单特征:

我尝试过条件 for 循环和为每个变体创建一个新列表的想法,但这似乎是一个难以管理的解决方案。

有人能帮忙吗?

搜索 1: 如果 'banana' 在一个或多个嵌套列表中 然后打印每个嵌套列表

预期输出: [香蕉,10,黄色]

搜索 2: 如果 'yellow' 在一个或多个嵌套列表中 然后打印每个嵌套列表

预期输出: [香蕉,10,黄色] [芒果,5,黄色]

这是一个粗略的方法:

lists = [
    ["banana", 10, "yellow"], 
    ["apple", 12, "red"], 
    ["pear", 60, "green"], 
    ["mango", 5, "yellow"],
]

keyword = 'banana'
for lst in lists:
    if keyword in lst:
        print(lst)

keyword = 'yellow'
for lst in lists:
    if keyword in lst:
        print(lst)

理想情况下,您会将搜索提取到接受列表和关键字的函数:

def get_sublists_containing_keyword(lists, keyword):
    sublists = []
    for lst in lists:
        if keyword in lst:
            sublists.append(lst)
    return sublists

lists = [
    ["banana", 10, "yellow"], 
    ["apple", 12, "red"], 
    ["pear", 60, "green"], 
    ["mango", 5, "yellow"],
]

banana_lists = get_sublists_containing_keyword(lists, 'banana')
yellow_lists = get_sublists_containing_keyword(lists, 'yellow')

for banana_list in banana_lists:
    print(banana_list)
for yellow_list in yellow_lists:
    print(yellow_list)

您可以在打印时使用str.<b>join(<i>iterable</i>)</b> inside a f-string去除字符串元素周围的单引号字符:

def print_lists_that_contain_search_term(lists: list[list[str | int]], 
                                         search_term: str) -> None:
    print(f'{search_term = }')
    print(' '.join(f'[{", ".join(map(str, lst))}]' for lst in lists if search_term in lst))

def main() -> None:
    lists = [['banana', 10, 'yellow'], ['apple', 12, 'red'], ['pear', 60, 'green'], ['mango', 5, 'yellow']]
    print_lists_that_contain_search_term(lists, 'banana')
    print_lists_that_contain_search_term(lists, 'yellow')

if __name__ == '__main__':
    main()

输出:

search_term = 'banana'
[banana, 10, yellow]
search_term = 'yellow'
[banana, 10, yellow] [mango, 5, yellow]

这里有一个单行解决方案。

def search(lists, item):
    return list(filter(None, map(lambda x: x if item in x else [], lists)))

现在您可以调用该函数并检查它了。

In [12]: lists
Out[12]: 
[['banana', 10, 'yellow'],
 ['apple', 12, 'red'],
 ['pear', 60, 'green'],
 ['mango', 5, 'yellow']]

In [13]: search(lists, 'banana')
Out[13]: [['banana', 10, 'yellow']]

In [14]: search(lists, 'yellow')
Out[14]: [['banana', 10, 'yellow'], ['mango', 5, 'yellow']]

代码解释

这里我使用了 lambda 表达式并检查了要搜索的项目是否在列表中然后 return 该列表否则 return 一个空列表。并通过过滤器功能删除了所有空列表。