在python中,如果不是每个项目都是列表,如何线性组合列表列表?

在python中,如果不是每个项目都是列表,如何线性组合列表列表?,python,list,Python,List,我有一个由字符串和列表组成的列表: a = ['a', 'b', 'c', 'd', 'e', ['fgh', 'rst'], 'i',['quv','wxy']] 如何连接此列表中的每个元素,以便所有字符串元素都包含每个内部列表元素中的一个,同时保持它们在原始列表中的位置?例: targets = ['abcdefghiquv', 'abcdefghiwxy', 'abcderstiquv', 'abcderstiwxy',

我有一个由字符串和列表组成的列表:

a = ['a', 'b', 'c', 'd', 'e', ['fgh', 'rst'], 'i',['quv','wxy']]
如何连接此列表中的每个元素,以便所有字符串元素都包含每个内部列表元素中的一个,同时保持它们在原始列表中的位置?例:

targets = ['abcdefghiquv',
           'abcdefghiwxy',
           'abcderstiquv',
           'abcderstiwxy',
          ]
我尝试了下面的方式,但是,只有当最后一个元素是列表时,这才有效

combinations = []
combinations2 = []
for s in a:
    if isinstance(s, basestring):
        combinations.append(s)
    else:
        seqint = ''.join(combinations)
        combinations2.append([seqint])
        combinations2.append(s)
        combinations[:]=[]
for comb in list(itertools.product(*combinations2)):
    print ''.join(comb)

使用
itertools.product
无疑是一条出路。我会这样做(可能不完全正确,因为我从来没有太多地使用遗留Python):

最后一步叫做列表理解。它们非常有用,因此可以很好地利用时间阅读它们(还有字典理解和生成器理解)

现在,我们有一个新列表,如下所示:

newa = [['a'], ['b'], ['c'], ['d'], ['e'], ['fgh', 'rst'], ['i'],['quv','wxy']]
然后像以前一样完成:

from itertools import product

for comb in list(product(*newa)):
    print ''.join(comb)
编辑:如果你真的想变得粗糙,你可以在一条语句中完成所有这些。但我不推荐(不太可读):


看起来您正在学习,所以我要补充一点:除非您有很好的理由学习使用传统Python(2),否则我建议您切换到现代Python(当前版本3.6)。在这一点上,一切都朝着这个方向发展(尽管在许多情况下,传统的Python可能还会存在一段时间)

获取列表索引并使用itertools.product的另一种方法

a = ['a', 'b', 'c', 'd', 'e', ['fgh', 'rst'], 'i',['quv','wxy'] ]
idx = []
lst = []
for i in a:
    if isinstance(i, list):
        idx.append(a.index(i))
        lst.append(i)

from itertools import product

for j in [ dict( zip(idx,i) ) for i in product(*lst) ] :
    for k,v in j.items():
        a[k] = v
    print ( ''.join(a) )

作为一种功能样式,您可以
减少
列表:

list(reduce(lambda x, y: (x1 + "".join(y1) for x1 in x for y1 in y), a))
['abcdefghiquv', 'abcdefghiwxy', 'abcderstiquv', 'abcderstiwxy']

你已经尝试过什么来解决这个问题?你能展示你的代码并解释你面临的困难吗?
a = ['a', 'b', 'c', 'd', 'e', ['fgh', 'rst'], 'i',['quv','wxy'] ]
idx = []
lst = []
for i in a:
    if isinstance(i, list):
        idx.append(a.index(i))
        lst.append(i)

from itertools import product

for j in [ dict( zip(idx,i) ) for i in product(*lst) ] :
    for k,v in j.items():
        a[k] = v
    print ( ''.join(a) )
list(reduce(lambda x, y: (x1 + "".join(y1) for x1 in x for y1 in y), a))
['abcdefghiquv', 'abcdefghiwxy', 'abcderstiquv', 'abcderstiwxy']