-1

假设我有一个清单:

my_list = ["A", "B", "C", "X", "X", "X"]

并且我想用另一个列表中的值替换 X 值,或者在我的情况下为 2D 列表(此列表生成的重复数等于列表中“X”的数量):

combinations = list(itertools.product('LE', repeat= 3))

所以

combinations = [('L', 'L', 'L'), ('L', 'L', 'E'), ('L', 'E', 'L'), ('L', 'E', 'E'), ('E', 'L', 'L'), ('E', 'L', 'E'), ('E', 'E', 'L'), ('E', 'E', 'E')]

我的问题是如何my_list用组合中的值替换“X”值,以便第一个结果["A", "B", "C", "L", "L", "L"]和第二个结果["A", "B", "C", "L", "L", "E"]等。最好我想将它们放入一个二维列表中,然后我可以打印。

编辑:为了澄清,my_list将是未知的,“X”值可能以未知的方式分散。

4

2 回答 2

3

我可能会使用:

def mergefill(to_fill, fill_char, fill_from):
    for filler in fill_from:
        it = iter(filler)
        yield [c if c != fill_char else next(it) for c in to_fill]

这使

>>> my_list = ["A", "B", "C", "X", "X", "X"]
>>> list(mergefill(my_list, 'X', product('LE', repeat=3)))
[['A', 'B', 'C', 'L', 'L', 'L'], ['A', 'B', 'C', 'L', 'L', 'E'], ['A', 'B', 'C', 'L', 'E', 'L'], ['A', 'B', 'C', 'L', 'E', 'E'], ['A', 'B', 'C', 'E', 'L', 'L'], ['A', 'B', 'C', 'E', 'L', 'E'], ['A', 'B', 'C', 'E', 'E', 'L'], ['A', 'B', 'C', 'E', 'E', 'E']]

它还处理填充字符不连续的情况:

>>> my_list = ["A", "X", "B", "X"]
>>> list(mergefill(my_list, 'X', product('LE', repeat=2)))
[['A', 'L', 'B', 'L'], ['A', 'L', 'B', 'E'], ['A', 'E', 'B', 'L'], ['A', 'E', 'B', 'E']]
于 2013-03-17T13:10:44.893 回答
2

尝试这个:

my_list = ['A', 'B', 'C', 'X', 'X', 'X']
new_list = [my_list[:3] + list(c) for c in itertools.product('LE',repeat=3)]
[['A', 'B', 'C', 'L', 'L', 'L'],                                                
 ['A', 'B', 'C', 'L', 'L', 'E'],                                                
 ['A', 'B', 'C', 'L', 'E', 'L'],                                                
 ['A', 'B', 'C', 'L', 'E', 'E'],                                                
 ['A', 'B', 'C', 'E', 'L', 'L'],                                                
 ['A', 'B', 'C', 'E', 'L', 'E'],                                                
 ['A', 'B', 'C', 'E', 'E', 'L'],                                                
 ['A', 'B', 'C', 'E', 'E', 'E']]

要获取 my_list 中“X”的数量:

count = len(filter(lambda v: v == 'X',my_list))
于 2013-03-17T13:06:50.987 回答