用Pythonic方法查找字符串是否包含多个值?

用Pythonic方法查找字符串是否包含多个值?,python,string,find,Python,String,Find,我试图通过文件列表查找所有excel、txt或csv文件,并将它们附加到列表中 goodAttachments = [i for i in attachments if str(i).split('.')[1].find(['xlsx','csv','txt']) 这显然不起作用,因为find()需要字符串而不是列表。我应该在列表理解中尝试列表理解吗?您可以尝试以下方法: goodAttachments = [i for i in attachments if str(i).split('.'

我试图通过文件列表查找所有
excel
txt
csv
文件,并将它们附加到列表中

goodAttachments = [i for i in attachments if str(i).split('.')[1].find(['xlsx','csv','txt'])

这显然不起作用,因为
find()
需要字符串而不是列表。我应该在列表理解中尝试列表理解吗?

您可以尝试以下方法:

goodAttachments = [i for i in attachments if str(i).split('.')[-1] in ['xlsx', 'csv', 'txt']]

这将检查最后一个“.”之后的扩展名是否与“xlsx”、“csv”或“txt”中的一个完全匹配。

您可以尝试以下方法:

goodAttachments = [i for i in attachments if str(i).split('.')[-1] in ['xlsx', 'csv', 'txt']]
[i for i in attachments if any([e in str(i).split('.')[1] for e in ['xlsx','csv','txt']]))
这将检查最后一个“.”之后的扩展名是否与“xlsx”、“csv”或“txt”中的一个完全匹配

[i for i in attachments if any([e in str(i).split('.')[1] for e in ['xlsx','csv','txt']]))
就像你说的,嵌套列表理解

编辑:这将在不拆分的情况下工作,我试图复制
find
中的逻辑

就像你说的,嵌套列表理解


编辑:这将在不拆分的情况下工作,我试图复制
find

中的逻辑,没有必要拆分或使用双列表理解。您可以使用
str.endswith
,它将要检查的字符串元组作为参数:

goodAttachments = [i for i in attachments if str(i).endswith(('.xlsx', '.csv', '.txt'))]
如果确实要拆分,请执行以下操作:

goodAttachments = [i for i in attachments if str(i).split('.')[-1] in ('xlsx', 'csv', 'txt')]

第一种方法更好,因为它可以处理没有扩展名的文件。

不需要拆分或使用双重列表。您可以使用
str.endswith
,它将要检查的字符串元组作为参数:

goodAttachments = [i for i in attachments if str(i).endswith(('.xlsx', '.csv', '.txt'))]
如果确实要拆分,请执行以下操作:

goodAttachments = [i for i in attachments if str(i).split('.')[-1] in ('xlsx', 'csv', 'txt')]

第一种方法更好,因为它可以处理没有扩展名的文件。

您可以检查最后一个点之后的所有内容是否都出现在第二个列表中。使用
[-1]
而不是
[1]
可确保名为
的文件与.this.txt
类似,将返回最后一次拆分的
txt
,而不是
this

goodAttachments = [i for i in attachments if str(i).split('.')[-1] in ['xlsx','csv','txt']]

您可以检查最后一个点之后的所有内容是否出现在第二个列表中。使用
[-1]
而不是
[1]
可确保名为
的文件与.this.txt
类似,将返回最后一次拆分的
txt
,而不是
this

goodAttachments = [i for i in attachments if str(i).split('.')[-1] in ['xlsx','csv','txt']]

我建议再添加几行,然后尝试创建一个包含嵌套列表理解的单行。虽然这样做可行,但我认为将这些理解拆分成单独的行可以使代码更具可读性

import os

attachments = ['sadf.asdf', 'asd/asd/asd.xslx']
whitelist = {'.xslx', '.csv'}

extentions = (os.path.split(fp)[1] for fp in attachments)
good_attachments = [fp for fp, ext in zip(attachments, extentions) if ext in whitelist]

我还使用了
os.path.split
over
str.split
,因为文件中可能有多个点,并且此拆分是为这个精确的任务而设计的。

我建议可能再添加几行,然后尝试创建一个包含嵌套列表理解的单行。虽然这样做可行,但我认为将这些理解拆分成单独的行可以使代码更具可读性

import os

attachments = ['sadf.asdf', 'asd/asd/asd.xslx']
whitelist = {'.xslx', '.csv'}

extentions = (os.path.split(fp)[1] for fp in attachments)
good_attachments = [fp for fp, ext in zip(attachments, extentions) if ext in whitelist]
我还使用了
os.path.split
over
str.split
,因为文件中可能存在多个点,并且此拆分是为这个精确的作业而设计的