假设我有一个清单:
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”值可能以未知的方式分散。
答案 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))