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')
('#', '!')
然后 join
ed 就可以了。
我有两个列表,例如:
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')
('#', '!')
然后 join
ed 就可以了。