0

我在 Python 中有两个列表,如下所示:

 lst = [1, '?2']
 replace_lst1 = ['a','b','c']

对于 in 的每次出现'?2'lst我想用其中的每个元素替换它,replace_lst1从而生成如下列表:

res = [ [1,'a'], 
        [1,'b'],
        [1,'c'] ]

同样,如果我有以下列表:

lst = [1, '?2','?3']
replace_lst1 = ['a','b','c']
replace_lst2 = ['A', 'B', 'C']

我想'?2'用 中的每个元素replace_lst1'?3'中的每个元素替换replace_lst2,从而探索所有可能的排列。结果应如下所示:

res = [ [1,'a','A'], 
        [1,'a','B'],
        [1,'a','C'],
        [1,'b','A'], 
        [1,'b','B'],
        [1,'b','C'],
        [1,'c','A'], 
        [1,'c','B'],
        [1,'c','C'] ]

如果您能给我一些如何进行的建议,那就太好了。

谢谢!

4

3 回答 3

3

如果你稍微改变你的数据结构,这对itertools模块来说是一个微不足道的问题:

>>> lst = [1]
>>> combine = [["a", "b", "c"], ["A", "B", "C"]]
>>> import itertools
>>> [lst+list(item) for item in itertools.product(*combine)]
[[1, 'a', 'A'], [1, 'a', 'B'], [1, 'a', 'C'], [1, 'b', 'A'], [1, 'b', 'B'], 
 [1, 'b', 'C'], [1, 'c', 'A'], [1, 'c', 'B'], [1, 'c', 'C']]
于 2013-06-06T12:07:10.247 回答
3
>>> from itertools import product
>>> lst = [1]
>>> combine = [["a", "b", "c"], ["A", "B", "C"]]
>>> list(product(*[lst]+combine))
[(1, 'a', 'A'), (1, 'a', 'B'), (1, 'a', 'C'), (1, 'b', 'A'), (1, 'b', 'B'), (1, 'b', 'C'), (1, 'c', 'A'), (1, 'c', 'B'), (1, 'c', 'C')]

你也可以使用

list(product(lst, replace_lst1, replace_lst2))
于 2013-06-06T12:10:25.257 回答
0

我会使用 itertools.product,加上一个测试来替换 ? 按价值:

lst = [1, '?2','?3']
replace_lst1 = ['a','b','c']
replace_lst2 = ['A', 'B', 'C']
res = []
#put as many replace_lst as you need here
for values in itertools.product(replace_lst1, replace_lst2):
    val_iter = iter(values)
    res.append([x if str(x).find('?') == -1 else next(val_iter) for x in lst])

val_iter 的使用允许将 ?* 放置在任何地方(但不是按任何顺序)。

于 2013-06-06T12:22:38.263 回答