2016-07-20 3 views
0

Можете ли вы предложить лучший способ комбинировать строки из списков?Идиоматический способ комбинирования строк с помощью понимания списка

Вот пример:

[ 'prefix-' + a + '-' + b for a in [ '1', '2' ] for b in [ 'a', 'b' ] ] 

что приводит:

['prefix-1-a', 'prefix-1-b', 'prefix-2-a', 'prefix-2-b'] 

Фактический контекст работы с файлами и путями:

dirs = [ 'dir1', 'dir2' ] 
files = [ 'file1', 'file2' ] 
[ 'home/' + d + '/' + f for d in dirs for f in files ] 

в результате:

['home/dir1/file1', 'home/dir1/file2', 'home/dir2/file1', 'home/dir2/file2'] 
+2

это может быть вопрос лучше всего подходит для [Обзор] Код (http://codereview.stackexchange.com/) – Aaron

ответ

3

Для работы именно с путями к файлам, используйте os.path.join:

dirs = ['dir1', 'dir2'] 
files = ['file1', 'file2'] 
[os.path.join('home', d, f) for d in dirs for f in files] 
+1

Это кажется наиболее pythonic способ пойти об этом (из ответов ниже). –

+0

@frist Это была моя ошибка. Я исправил его в оригинальном посте. – Luis

1

Как насчет str.join.

['-'.join(('prefix', a, b)) for a, b in zip('12', 'ab')] 

Как другие упомянули, вы должны использовать os.path.join для путей файлов.

0

Первый один: ['prefix-%s-%s' % (a,b) for a in [1, 2] for b in 'ab']

Второй может быть таким же образом, но вы можете использовать os.path.join нормализовать для Windows:

[os.path.join('home', dir_, file_) for dir_ in ['dir1', 'dir2'] for file_ in ['file1', 'file2']] 
3

Вы можете использовать список понимание, os.path.join функции и itertools модуль :

[os.path.join('home', a, b) for a, b in itertools.product(ddirs, files)] 
1

Вы можете использовать декартовую продукцию для списков.

import itertools 
for element in itertools.product(["1", "2"], ["a", "b"]): 
    print element 

# Gives 
('1', 'a') 
('1', 'b') 
('2', 'a') 
('2', 'b') 

Тогда присоединитесь к ним, как хотите.

Смежные вопросы