如何在python中通过列表运行数字?

如何在python中通过列表运行数字?,python,list,python-3.x,Python,List,Python 3.x,我有一个列表[X,9,2,1,8,X,8,7,0,8,8,0,5,0,8,9]。我希望能够将每个“X”字符串替换为数字0-9,并使用这些数字生成每个可能组合的列表 我已经初始化了新列表,并在中添加了旧列表中的项,并使用if语句用新值替换“X”,但运气不太好 期望的输出是生成每个组合的列表,其中“X”被数字0-9替换 我已经尝试将其转换为字符串,然后使用for循环替换X,如下所示: unknown = ['X', 9, 2, 1, 8, 'X', 8, 7, 0, 8, 8, 0, 5, 0, 8

我有一个列表
[X,9,2,1,8,X,8,7,0,8,8,0,5,0,8,9]
。我希望能够将每个“X”字符串替换为数字0-9,并使用这些数字生成每个可能组合的列表

我已经初始化了新列表,并在中添加了旧列表中的项,并使用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))

但这并没有给我所有可能的组合。

只需一行就可以了。这就是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)]

我建议计算要替换的元素数量,然后使用
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')))]

使用
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来做作业

发布你尝试过的内容,并给我们一些示例说明它应该是什么样子。我检测到作业。特别是今天早些时候刚刚提出这个问题。你看了吗?今天早些时候在哪里被问到的?好的,非常接近=/不管这是不是家庭作业。重要的是,如果OP真的尝试了足够多的代码,但失败了。你的第一个答案更好。改回来了。我想他只需要一个变量xI已经用我在上面的尝试中显示的相同值完成了“x”,但是您的第一个示例可能会工作(但是将
xrange
更正为
range
haha)@lan您使用的是Python 3.x。因此,在Python 2中需要使用
range
而不是
xrange
,如果使用
range(10)
而不是
'1234567890'
,则可以避免以后使用
int
强制转换。