Python 中没有重复项的两个列表的排列

Permutation from two lists without duplicates in Python

我有两个列表,例如:

digits = ['1', '2', '3', '4']
chars = ['!', '@', '#', '$']

而且我需要从这两个 table 中获取所有排列而不重复,但是假设 如果我组合使用“数字”中的第一个元素 table ,我不能使用“chars”中的第一个。第二,第三等相同

具体顺序并不重要。但需要在其他长度的输入列表中工作。输入列表的最大长度为 10,排列的最大长度为 10。

例如,2 个字符的长度排列需要如下所示:

12
13
14
21
23
24
31
32
34
41
42
43
!@
!#
!$
@!
@#
@$
#!
#@
#$
$!
$@
$#
!2
!3
!4
@1
@3
@4
#1
#2
#4



1@
1#
1$
2!
2#
2$
3!
3@
3$
4!
4@
4#

我将感谢你的帮助,我的思绪因思考解决方案而激动:)

你可以这样做:

def calculate(digits, chars):
    from itertools import permutations
    indices = list(permutations(range(len(digits)), 2))
    a = [digits[i] + digits[j] for i,j in indices]
    b = [chars[i] + chars[j] for i,j in indices]
    c = [chars[i] + digits[j] for i,j in indices]
    d = [digits[i] + chars[j] for i,j in indices]
    return a + b + c + d

这只是计算所需的排列索引。您的目标是然后将来自各个数组中的索引的值组合起来。这里,a, b, c, d 是生成输出所需的 4 种组合。注意数字和字符的组合方式。

from itertools import permutations, product

digits = ['1', '2', '3', '4']
chars = ['!', '@', '#', '$']
k = 2

for perm in permutations(zip(digits, chars), k):
    for prod in product(*perm):
        print(''.join(prod))

这是长度 k 的排列。如果您想要所有长度,请将硬编码的 k 替换为 for k in range(len(digits) + 1):.

压缩列表会为您提供选项对​​:

('1', '!')
('2', '@')
('3', '#')
('4', '$')

然后 permutations 给出这些选项对的排列:

(('1', '!'), ('2', '@'))
(('1', '!'), ('3', '#'))
(('1', '!'), ('4', '$'))
(('2', '@'), ('1', '!'))
(('2', '@'), ('3', '#'))
(('2', '@'), ('4', '$'))
(('3', '#'), ('1', '!'))
(('3', '#'), ('2', '@'))
(('3', '#'), ('4', '$'))
(('4', '$'), ('1', '!'))
(('4', '$'), ('2', '@'))
(('4', '$'), ('3', '#'))

然后将每个这样的排列输入 product 中,得到字符串的排列,例如 (('3', '#'), ('1', '!')) 的乘积给出这些:

('3', '1')
('3', '!')
('#', '1')
('#', '!')

然后 joined 就可以了。