Python: как найти присутствие каждого элемента списка в строке - PullRequest
3 голосов
/ 20 сентября 2009

Какой самый питонный способ найти присутствие каждого имени каталога ['spam', 'eggs'] в пути, например, "/home/user/spam/eggs"

Пример использования (не работает, но объясняет мой случай):

dirs = ['spam', 'eggs']
path = "/home/user/spam/eggs"
if path.find(dirs):
    print "All dirs are present in the path"

Спасибо

Ответы [ 5 ]

9 голосов
/ 21 сентября 2009

set.issubset * * 1004 >>> set(['spam', 'eggs']).issubset('/home/user/spam/eggs'.split('/')) True

5 голосов
/ 20 сентября 2009

Похоже, вы хотите что-то вроде ...:

if all(d in path.split('/') for d in dirs):
   ...

Этот однострочный стиль неэффективен, поскольку он сохраняет путь разделения для каждого d (и split создает список, в то время как набор лучше для проверки членства) Делаем его в 2-х вкладышах:

pathpieces = set(path.split('/'))
if all(d in pathpieces for d in dirs):
   ...

значительно улучшает производительность.

2 голосов
/ 20 сентября 2009
names = ['spam', 'eggs']
dir   = "/home/user/spam/eggs"

# Split into parts
parts = [ for part in dir.split('/') if part != '' ]

# Rejoin found paths
dirs  = [ '/'.join(parts[0:n]) for (n, name) in enumerate(parts) if name in names ]

Редактировать: Если вы просто хотите проверить, существуют ли все каталоги:

parts = "/home/user/spam/eggs".split('/')

print all(dir in parts for dir in ['spam', 'eggs'])
1 голос
/ 20 сентября 2009

Может, это то, что вы хотите?

dirs = ['spam', 'eggs']
path = "/home/user/spam/eggs"
present = [dir for dir in dirs if dir in path]
0 голосов
/ 20 сентября 2009

Один вкладыш, использующий генераторы (использующий текстовый поиск и не воспринимающий имена как что-либо, связанное с файловой системой - ваш запрос мне не совсем понятен)

[x for x in dirs if x in  path.split( os.sep )]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...