在列表中搜索字符串并删除没有完全包含它的列表



我有一个变量(x),它下面有多个列表。列表的最后一项引用列表中的第一个项。(例如,最后一项值为'1'的列表与第一项值为'1'的列表兼容)

['1', 'test', '3']
['2', 'test2', '1']
['3', 'test3', '4']
['4', 'test4', '3']

如何首先搜索包含test2的列表,然后搜索与test2兼容的列表,然后删除所有不包含这两个列表的列表?

结果应该如下:

['1', 'test', '3']
['2', 'test2', '1']

我根本没能想出答案。还有一个值得关注的地方是,'test2'兼容列表可能在它上面或下面(就像'test3 '列表的情况一样)。

分两步完成:

  1. 收集所有包含'test2'的三元组;
  2. 收集所有兼容的三元组
x = [
['1', 'test', '3'],
['2', 'test2', '1'],
['3', 'test3', '4'],
['4', 'test4', '3']
]
have_test2 = [t for t in x if t[1] == 'test2']
compatible_numbers = {n for (_,_,n) in have_test2}
are_compatible = [t for t in x if t[0] in compatible_numbers]
print(have_test2, are_compatible)
# [['2', 'test2', '1']] [['1', 'test', '3']]

或者更直接一点:

x = ...
compatible_numbers = {n for (_,test,n) in x if test == 'test2'}
all_results = [t for t in x if t[1] == 'test2' or t[0] in compatible_numbers]
print(all_results)
# [['1', 'test', '3'], ['2', 'test2', '1']]

重要提示

你可能注意到我在定义compatible_numbers时使用了花括号{ }。这个符号定义了set而不是listset是一种与列表略有不同的数据结构,当需要测试成员关系时,它们特别有效。因为compatible_numbers是一个集合,所以隶属度测试if t[0] in compatible_numbers是快速的;如果compatible_numbers是一个列表,它会很慢。

注意这里的set是python数据结构的名称。它是其他编程语言中类似结构的相对标准名称。此数据结构与数学对象"集合"共享其名称。这个共同的名字不是巧合,但是,编程集和数学集仍然不是一回事;-)

我会这样做:

x = [
['1', 'test', '3'],
['2', 'test2', '1'],
['3', 'test3', '4'],
['4', 'test4', '3']]
output = []
for sub_list in x:
if sub_list[1] == "test2":
compatible = int(sub_list[2])
output.append(sub_list)
output+=[y for y in x if y[0] is compatible]

相关内容

最新更新