我有一个列表[X, 9, 2, 1, 8, X, 8, 7, 0, 8, 8, 0, 5, 0, 8, 9]
。我希望能够用数字0 - 9替换每个'X'字符串,并生成这些数字可能的每个组合的列表。
我正在初始化新列表并附加旧列表中的项目并使用if语句将'X'替换为新值,但运气不佳。
所需的输出是生成每个组合的列表,其中'X'被数字0-9替换。
我已经尝试将其转换为字符串,然后使用for循环替换X,如下所示:
unknown = ['X', 9, 2, 1, 8, 'X', 8, 7, 0, 8, 8, 0, 5, 0, 8, 9]
unknown = ''.join(unknown)
for i in range(10):
known = unknown.replace('X', str(i))
x = unknown.replace('X', str(i))
但这并没有给我所有可能的组合。
答案 0 :(得分:2)
我建议计算要替换的元素数量,然后使用itertools.product
生成所有组合。
replacement_count = lst.count('X')
combinations = itertools.product(range(10), repeat=replacement_count)
for combo in combinations:
combo = iter(combo)
new_lst = [next(combo) if ch=='X' else ch for ch in lst]
这构建了我见过的最丑陋的单行:
[[next(combo) if ch=='X' else ch for ch in lst] for combo in map(iter, itertools.product(range(10), repeat=lst.count('X')))]
答案 1 :(得分:0)
只需一行即可。这是Python的强大功能:
[[x, 9, 2, 1, 8, y, 8, 7, 0, 8, 8, 0, 5, 0, 8, 9] for x in range(10) for y in range(10)]
如果您希望两个'X'
具有相同的值,则更容易:
[[x, 9, 2, 1, 8, x, 8, 7, 0, 8, 8, 0, 5, 0, 8, 9] for x in range(10)]
答案 2 :(得分:0)
使用product
itertools
来自itertools导入产品
l = ['X', 9, 2, 1, 8, 'X', 8, 7, 0, 8, 8, 0, 5, 0, 8, 9]
>>> for numPerm in product(range(10), repeat = l.count('X')):
s = [_ for _ in l]
for num,index in zip(list(numPerm),[i for i,j in enumerate(l) if j == 'X']):
s[index] = num
print(s)
这适用于任何数量的X,所以你不需要继续问SO做你的功课