2017-06-16 162 views
1
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的序列不匹配?

+0

是否在'final_list'元素的顺序和'criteria_list'有关系吗?顺便说一句,在你的代码中检查'criteria_list'中的每个元素,以及它是否包含在'final_list'的内部列表中。因此,如果内部列表类似'['abc','def','section',3]',那么它也会返回'True',您可能不需要 – kuro

+0

是的顺序很重要,我宁愿它返回true仅仅是开始序列匹配 – Darth

+0

因此,内部列表必须以“section”开头,对吧? – kuro

回答

1
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个元素,并与您的整个条件列表进行比较。

+1

你的意思是,当订单**做**事情 – kuro

+0

@ kuro谢谢!已经修复了它 –

+2

请注意,这不是一个通用的解决方案,因为匹配的长度是硬编码的...... –

1

你得到了输出,因为你永远不会检查你的内部列表和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) 
+0

你可能想要做的事情,检查'each_list'是否非空 – kuro

+0

@kuro你是绝对正确的(我会得到'IndexError')!我修复了代码。谢谢! –