为了账号安全,请及时绑定邮箱和手机立即绑定

获取 Python 中列表的所有组合,而没有相同字符连续重复两次

获取 Python 中列表的所有组合,而没有相同字符连续重复两次

阿波罗的战车 2021-08-24 14:56:21
之前已经问过很多类似的问题,但我还没有找到一个与我相同的用例。所以假设我有以下列表:列表 = [1,2,3]我将如何打印此列表的所有组合,其中相同的数字不会重复两次。我想要的输出是:123121321233132123132213232312321我将如何实现这一目标?大多数解决方案提供如下输出:123121332123132213232312321这里缺少 21,23 和 31,因为我认为它将 12、32 和 13 视为相同的组合,我不希望代码这样做。提前致谢
查看完整描述

2 回答

?
不负相思意

TA贡献1777条经验 获得超10个赞

很确定这是重复的,但我找不到好的。itertools.permutations当您迭代所有所需的长度时,做您想要的:


from itertools import permutations, chain


lst = [1,2,3]

list(chain(*(permutations(lst, n) for n in range(1, len(lst)+1))))

# [(1,), (2,), (3,), (1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2), (1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1)]

或:


for p in chain(*(permutations(lst, n) for n in range(1, len(lst)+1))):

    print(''.join(map(str, p)))


1

2

3

12

13

21

23

31

32

123

132

213

231

312

321


查看完整回答
反对 回复 2021-08-24
?
慕尼黑8549860

TA贡献1818条经验 获得超11个赞

令人作呕的单线似乎可以解决问题:


[

    int(''.join(map(str, number)))

    for n in range(1,4) 

    for number in itertools.product([1,2,3], repeat = n) 

    if not any([first == second for first, second in zip(number, number[1:])])

]

输出:


[1, 2, 3, 12, 13, 21, 23, 31, 32, 121, 123, 131, 132, 212, 213, 231, 232, 312, 313, 321, 323]


查看完整回答
反对 回复 2021-08-24
  • 2 回答
  • 0 关注
  • 262 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信