我有一个变量(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 '列表的情况一样)。
分两步完成:
- 收集所有包含'test2'的三元组;
- 收集所有兼容的三元组
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
而不是list
。set
是一种与列表略有不同的数据结构,当需要测试成员关系时,它们特别有效。因为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]