我在Python中有两个列表如下所示:
lst = [1, '?2']
replace_lst1 = ['a','b','c']
对于'?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'] ]
如果您能为我提供一些如何继续的建议,那就太棒了。
谢谢!
答案 0 :(得分:3)
如果您稍微更改数据结构,这对itertools
module来说是一个微不足道的问题:
>>> 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']]
答案 1 :(得分: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))
答案 2 :(得分: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可以将?*放在任何地方(但不能以任何顺序放置)。