使用另一个列表中的值依次替换List值

时间:2013-03-17 13:02:36

标签: python list

假设我有一个清单:

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"]等。我最好将这些放入2D列表中,然后打印出来。

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

2 个答案:

答案 0 :(得分: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']]

答案 1 :(得分: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))