如何在for循环中部分匹配Python中的列表?
final_list = [
['section', 'section', 'section', 3, 'mirror', 0, 'blue'],
['section', 'section', 'section', 3, 'mirror'],
['section', 'section', 'section', 3, 'light',],
['subsection', 'section', 'section', 3, 'light',]
]
criteria_list = ['section', 'section', 'section', 3]
cp = True
exclude_keyword = 'mirror'
for each_list in final_list:
for check in criteria_list:
if check in each_list and exclude_keyword not in each_list:
cp = True
else:
cp = False
if cp == True:
print(each_list)
我有这个循环,从列表中选择列表。它应该部分匹配criteria_list的开始元素,并排除后面的某些关键字元素,例如镜像元素。如何在for循环中部分匹配Python中的列表?
问题是它的部分不匹配criteria_list
的开始序列。所以基本上它返回['section', 'section', 'section', 3, 'light',]
和['subsection', 'section', 'section', 3, 'light',]
,而不是仅仅
['section', 'section', 'section', 3, 'light',]
为“小节”元素criteria_list的序列不匹配?
final_list = [
['section', 'section', 'section', 3, 'mirror', 0, 'blue'],
['section', 'section', 'section', 3, 'mirror'],
['section', 'section', 'section', 3, 'light',],
['subsection', 'section', 'section', 3, 'light',]
]
criteria_list = ['section', 'section', 'section', 3]
exclude_keyword = 'mirror'
for lista in final_list: # Loop through the main list
if lista[:len(criteria_list)] == criteria_list and exclude_keyword not in lista: # checks if first elements are equal your criteria_list (if the order doesn't matter, this won't work). And checks if excluded_keyword is not inside this sublist.
cp = True
print(lista) # prints sublist.
else:
cp = False
如果在criteria_list上的元素顺序确实很重要,
我使用列表slicing
只获得final_list子列表的前4个元素,并与您的整个条件列表进行比较。
你得到了输出,因为你永远不会检查你的内部列表和criteria_list
的开始的平等,你只需检查在每个内部的criteria_list
的元素的存在。该工程
代码:
final_list = [
['section', 'section', 'section', 3, 'mirror', 0, 'blue'],
['section', 'section', 'section', 3, 'mirror'],
['section', 'section', 'section', 3, 'light',],
['subsection', 'section', 'section', 3, 'light',]
]
criteria_list = ['section', 'section', 'section', 3]
cp = True
exclude_keyword = 'mirror'
for each_list in final_list:
cp = False
if exclude_keyword not in each_list and each_list:
# you don't need to check for equality of the beginning
# if you got your exclude keyword
for index, check in enumerate(criteria_list):
if check == each_list[index]:
cp = True
else:
# if at some index equality fails then you should stop comparing
cp = False
break
if cp == True:
print(each_list)
你可能想要做的事情,检查'each_list'是否非空 – kuro
@kuro你是绝对正确的(我会得到'IndexError')!我修复了代码。谢谢! –
是否在'final_list'元素的顺序和'criteria_list'有关系吗?顺便说一句,在你的代码中检查'criteria_list'中的每个元素,以及它是否包含在'final_list'的内部列表中。因此,如果内部列表类似'['abc','def','section',3]',那么它也会返回'True',您可能不需要 – kuro
是的顺序很重要,我宁愿它返回true仅仅是开始序列匹配 – Darth
因此,内部列表必须以“section”开头,对吧? – kuro