用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
overstr.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
overstr.split
,因为文件中可能存在多个点,并且此拆分是为这个精确的作业而设计的