创建排列矩阵
Creating a matrix of permutations
我正在尝试制作一个我可以评估其子集的排列矩阵,但我在实际制作矩阵时遇到了问题。
目标是取 4 个唯一数字(比如说 4 5 6 7)并找到所有排列 (4x3x2x1 = 24) 并评估它们的子集。例如。一个数字是“6475”,第一个子集是前两位数字是“64”,第二个子集是最后两位数字“75”
但是我无法清理我的排列列表,因此我可以单独评估每个元素。
这是我的代码:
int_matrix = []
matrix = list(permutations([1,2,3,4]))
int_matrix = [int(i) for i in matrix.split(",")]
我得到这个错误:
AttributeError: 'list' object has no attribute 'split'
我的排列输出是:
[(1, 2, 3, 4), (1, 2, 4, 3), (1, 3, 2, 4), (1, 3, 4, 2), (1, 4, 2, 3), (1, 4, 3, 2), (2, 1, 3, 4).....
我认为我的问题是我没有正确删除 "matrix" 中的逗号。对我应该做什么有什么建议吗?
您可以使用 reduce()
将您的元组转换为 int :
>>> [reduce(lambda x,y :x*10+y,i) for i in matrix]
[1234, 1243, 1324, 1342, 1423, 1432, 2134, 2143, 2314, 2341, 2413, 2431, 3124, 3142, 3214, 3241, 3412, 3421, 4123, 4132, 4213, 4231, 4312, 4321]
但是如果您想找到数字的子集,将它们转换为 int
并不是一个好主意!您可以使用 combinations
从元组中获取子集,例如:
>>> from itertools import combinations
>>> [list(combinations((1,2,3,4),i)) for i in range (1,5)]
[[(1,), (2,), (3,), (4,)], [(1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)], [(1, 2, 3), (1, 2, 4), (1, 3, 4), (2, 3, 4)], [(1, 2, 3, 4)]]
>>>
但是,如果您只想将数字分成两部分,则不需要转换为 int,您可以使用以下列表推导式:
>>> [(i[:2],i[2:]) for i in [''.join(map(str,i)) for i in matrix]]
[('12', '34'), ('12', '43'), ('13', '24'), ('13', '42'), ('14', '23'), ('14', '32'), ('21', '34'), ('21', '43'), ('23', '14'), ('23', '41'), ('24', '13'), ('24', '31'), ('31', '24'), ('31', '42'), ('32', '14'), ('32', '41'), ('34', '12'), ('34', '21'), ('41', '23'), ('41', '32'), ('42', '13'), ('42', '31'), ('43', '12'), ('43', '21')]
在这种情况下,您需要将具有 int 元素的元组转换为 str 您可以使用 ''.join(map(str,i)) for i in matrix
完成,然后您可以加入 them.and 使用切片来获取所需的部分。
此外,如果您想将部件转换为 int,请使用 map
函数:
>>> [map(int,(i[:2],i[2:])) for i in [''.join(map(str,i)) for i in matrix]]
[[12, 34], [12, 43], [13, 24], [13, 42], [14, 23], [14, 32], [21, 34], [21, 43], [23, 14], [23, 41], [24, 13], [24, 31], [31, 24], [31, 42], [32, 14], [32, 41], [34, 12], [34, 21], [41, 23], [41, 32], [42, 13], [42, 31], [43, 12], [43, 21]]
The reduce
function is apply function of two arguments cumulatively to the items of iterable, from left to right, so as to reduce the iterable to a single value. For example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) calculates ((((1+2)+3)+4)+5).
l = [(1, 2, 3, 4), (1, 2, 4, 3), (1, 3, 2, 4), (1, 3, 4, 2), (1, 4, 2, 3), (1, 4, 3, 2), (2, 1, 3, 4)]
print([int("".join(map(str,tup))) for tup in l])
[1234, 1243, 1324, 1342, 1423, 1432, 2134]
如果要分成两部分:
out = []
for tup in l:
joined = "".join(map(str, tup))
half = len(joined) // 2
a,b = int(joined[:half]),int(joined[half:])
out.append((a,b))
print(out)
[(12, 34), (12, 43), (13, 24), (13, 42), (14, 23), (14, 32), (21, 34)]
我正在尝试制作一个我可以评估其子集的排列矩阵,但我在实际制作矩阵时遇到了问题。
目标是取 4 个唯一数字(比如说 4 5 6 7)并找到所有排列 (4x3x2x1 = 24) 并评估它们的子集。例如。一个数字是“6475”,第一个子集是前两位数字是“64”,第二个子集是最后两位数字“75”
但是我无法清理我的排列列表,因此我可以单独评估每个元素。
这是我的代码:
int_matrix = []
matrix = list(permutations([1,2,3,4]))
int_matrix = [int(i) for i in matrix.split(",")]
我得到这个错误:
AttributeError: 'list' object has no attribute 'split'
我的排列输出是:
[(1, 2, 3, 4), (1, 2, 4, 3), (1, 3, 2, 4), (1, 3, 4, 2), (1, 4, 2, 3), (1, 4, 3, 2), (2, 1, 3, 4).....
我认为我的问题是我没有正确删除 "matrix" 中的逗号。对我应该做什么有什么建议吗?
您可以使用 reduce()
将您的元组转换为 int :
>>> [reduce(lambda x,y :x*10+y,i) for i in matrix]
[1234, 1243, 1324, 1342, 1423, 1432, 2134, 2143, 2314, 2341, 2413, 2431, 3124, 3142, 3214, 3241, 3412, 3421, 4123, 4132, 4213, 4231, 4312, 4321]
但是如果您想找到数字的子集,将它们转换为 int
并不是一个好主意!您可以使用 combinations
从元组中获取子集,例如:
>>> from itertools import combinations
>>> [list(combinations((1,2,3,4),i)) for i in range (1,5)]
[[(1,), (2,), (3,), (4,)], [(1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)], [(1, 2, 3), (1, 2, 4), (1, 3, 4), (2, 3, 4)], [(1, 2, 3, 4)]]
>>>
但是,如果您只想将数字分成两部分,则不需要转换为 int,您可以使用以下列表推导式:
>>> [(i[:2],i[2:]) for i in [''.join(map(str,i)) for i in matrix]]
[('12', '34'), ('12', '43'), ('13', '24'), ('13', '42'), ('14', '23'), ('14', '32'), ('21', '34'), ('21', '43'), ('23', '14'), ('23', '41'), ('24', '13'), ('24', '31'), ('31', '24'), ('31', '42'), ('32', '14'), ('32', '41'), ('34', '12'), ('34', '21'), ('41', '23'), ('41', '32'), ('42', '13'), ('42', '31'), ('43', '12'), ('43', '21')]
在这种情况下,您需要将具有 int 元素的元组转换为 str 您可以使用 ''.join(map(str,i)) for i in matrix
完成,然后您可以加入 them.and 使用切片来获取所需的部分。
此外,如果您想将部件转换为 int,请使用 map
函数:
>>> [map(int,(i[:2],i[2:])) for i in [''.join(map(str,i)) for i in matrix]]
[[12, 34], [12, 43], [13, 24], [13, 42], [14, 23], [14, 32], [21, 34], [21, 43], [23, 14], [23, 41], [24, 13], [24, 31], [31, 24], [31, 42], [32, 14], [32, 41], [34, 12], [34, 21], [41, 23], [41, 32], [42, 13], [42, 31], [43, 12], [43, 21]]
The
reduce
function is apply function of two arguments cumulatively to the items of iterable, from left to right, so as to reduce the iterable to a single value. For example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) calculates ((((1+2)+3)+4)+5).
l = [(1, 2, 3, 4), (1, 2, 4, 3), (1, 3, 2, 4), (1, 3, 4, 2), (1, 4, 2, 3), (1, 4, 3, 2), (2, 1, 3, 4)]
print([int("".join(map(str,tup))) for tup in l])
[1234, 1243, 1324, 1342, 1423, 1432, 2134]
如果要分成两部分:
out = []
for tup in l:
joined = "".join(map(str, tup))
half = len(joined) // 2
a,b = int(joined[:half]),int(joined[half:])
out.append((a,b))
print(out)
[(12, 34), (12, 43), (13, 24), (13, 42), (14, 23), (14, 32), (21, 34)]