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

时间:2015-10-29 19:11:16

标签: python list python-3.x

我有一个列表[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))

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

3 个答案:

答案 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做你的功课