Pythonic способ найти, если строка содержит несколько значений? - PullRequest
0 голосов
/ 24 октября 2018

Я пытаюсь найти в списке файлов все файлы excel, txt или csv и добавить их в список

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

Это, очевидно, не работает, потому что find() нужна строка, а не список.Должен ли я попробовать понимание списка внутри понимания списка?

Ответы [ 5 ]

0 голосов
/ 24 октября 2018

Я хотел бы предложить, возможно, добавить еще несколько строк, чем пытаться создать однострочник с вложенными списками.Хотя это сработало бы, я думаю, что это делает более читабельный код для разделения этих представлений на отдельные строки.

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, так как файл может содержать несколько точеки этот сплит предназначен именно для этой работы.

0 голосов
/ 24 октября 2018

Вы можете проверить, что все, что находится после последней точки, присутствует во втором списке.использование [-1] вместо [1] гарантирует, что файлы с именем like.this.txt вернут последнее разделение txt, а не this.

goodAttachments = [i for i in attachments if str(i).split('.')[-1] in ['xlsx','csv','txt']]
0 голосов
/ 24 октября 2018
[i for i in attachments if any([e in str(i).split('.')[1] for e in ['xlsx','csv','txt']]))

Как вы сказали, понимание вложенного списка.

Редактировать: Это будет работать без разбиения, я пытался повторить логику в find.

0 голосов
/ 24 октября 2018

Нет необходимости разбивать или использовать двойной список.Вы можете использовать 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')]

Первый способ лучше, так какучетные записи для файлов без расширения.

0 голосов
/ 24 октября 2018

Вы можете попробовать что-то вроде этого:

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

Это проверит, будет ли расширение после последнего '.'точно соответствует одному из 'xlsx', 'csv' или 'txt'.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...