我有 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']
>>>
