通过列表理解组合字符串的惯用方法

Idiomatic way to combine strings via list comprehension

你能推荐一种更好的方法来组合列表中的字符串吗?

这是一个例子:

[ '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']

str.join.

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

正如其他人提到的,您应该使用 os.path.join 作为文件路径。

第一个:['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']]

您可以使用列表理解、os.path.join 函数和 itertools 模块:

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

您可以对列表使用笛卡尔积。

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

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

然后随心所欲地加入他们。

要专门处理文件路径,请使用 os.path.join:

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