Skip to main content
 首页 » 编程设计

python之具有两个 "fors"和一个 "if"条件的列表理解

2025年05月04日22mq0036

我有 2 个列表:

>>> phrases = ['emp_sal','emp_addr'] 
>>> cols = ['emp_sal_total','emp_sal_monthly','emp_addr_primary','emp_ssn','emp_phone'] 

我正在尝试使用列表理解并过滤掉 cols 这样只有 cols 中的那些值才应该被选择具有短语 emp_sal或其中的 emp_addr。

所以,输出应该是:

['emp_sal_total','emp_sal_monthly','emp_addr_primary'] 

这只是一个复制场景的虚拟示例。实际示例有一个包含 180 个奇数列的 cols 列表。

尝试了以下解决方案:

new_cols = [c for c in cols if p for p in phrases in c] 

它失败了:

Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
TypeError: 'in <string>' requires string as left operand, not list 

下面的方法产生一个空白列表:

  >>> [c for c in cols if p in c for p in phrases] 
   [] 

请您参考如下方法:

您需要测试 phrases 中的任何字符串是否在您在 cols 中迭代的当前列中。为此,使用 any():

[c for c in cols if any(c.startswith(p) for p in phrases)] 

你的方法的问题是你试图在它被定义之前使用 p,这引发了一个 NameError:

>>> [c for c in cols if p in c for p in phrases] 
Traceback (most recent call last): 
  File "<stdin>", line 1, in <module> 
NameError: name 'p' is not defined 

正如@Hamms 在评论中指出的那样,您仍然可以使用与您的方法类似的方法。在尝试使用它之前,您只需要定义 p 即可:

>>> [c for c in cols for p in phrases if p in c] 
['emp_sal_total', 'emp_sal_monthly', 'emp_addr_primary'] 
>>>