查找字符串是否包含多个值的Python方法?

时间:2018-10-24 16:02:09

标签: python string find

我正在尝试通过文件列表查找所有exceltxtcsv文件,并将它们附加到列表中

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

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

5 个答案:

答案 0 :(得分:4)

无需拆分或使用双列表理解。您可以使用str.endswith,它使用一个字符串元组作为参数进行检查:

goodAttachments = [i for i in attachments if str(i).endswith(('.xlsx', '.csv', '.txt')))

如果您真的要拆分:

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

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

答案 1 :(得分:1)

您可以尝试这样的事情:

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

这将检查扩展名是否位于最后一个'。'之后。完全匹配“ xlsx”,“ csv”或“ txt”之一。

答案 2 :(得分:0)

[i for i in attachments if any([e in str(i).split('.')[1] for e in ['xlsx','csv','txt']]))

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

编辑:这将不会分裂,我正在尝试在find中复制逻辑。

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

我建议也许再增加几行,然后尝试创建具有嵌套列表理解的单行代码。虽然可以,但我认为将这些理解拆分为单独的行将使代码更具可读性。

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上使用了str.split,因为该文件可能存在多个点,并且此拆分是针对此确切的工作而设计的。