是否有 Python 函数可以在不重复某些元素位置的情况下进行排列?
Is there a Python Function to make a permutation without repeating certain elements places?
我想制作一个掩码,它可以让我在给定的数据结构中取某些值,而不会重复位置:
例如,如果我有:
[0,0,0,0,1,1]
随机选择的排列之一是:
[1,1,0,0,0,0]
我希望数组中的位置 0 和 1 不用于下一个排列:
[1,0,0,0,0,1] 不应被允许,因为位置 0 已被使用。
[0,0,1,0,0,1] 应该是允许的,因为位置 0 和位置 1 没有被使用。
而对于下一个排列,它不能占据位置2和5,因为第二个排列已经占据了它,所以剩下的唯一选择是:
[0,0,0,1,1,0]
我不知道是否有内置函数可以让我这样做:
fun(value_options=[0,0,0,0,1,1], number_of_combinations_to_take=3)
# Output:
[ [1,1,0,0,0,0], [0,0,1,0,0,1], [0,0,0,1,1,0] ]
提前致谢,祝您有愉快的一天
PS:这个函数的objective就是有很多排列组合让我可以这样做:
a, b, c, d, e, f = [1,1,0,0,0,0]
Node(p +jump*a, p + jump*b, p + jump*c, p + jump*d, p + jump*e, p + jump*f)
所以我只能在某个方向移动函数。
考虑到这些限制,与其生成一个详尽的排列列表然后在事后过滤它,我认为通过打乱索引列表并从该列表中弹出元素来解决这个问题更有意义(没有重复)来生成掩码。
>>> import random
>>> def fun(v, n):
... i = list(range(len(v)))
... random.shuffle(i)
... m = sum(v)
... r = []
... for _ in range(n):
... p = [0] * len(v)
... for _ in range(m):
... p[i.pop()] = 1
... r.append(p)
... return r
...
>>> fun([0, 0, 0, 0, 1, 1], 3)
[[0, 0, 0, 1, 0, 1], [0, 0, 1, 0, 1, 0], [1, 1, 0, 0, 0, 0]]
Sam 先于我,但如果这对你有帮助
def fun(n, m=2):
assert n % m == 0 # n has to be a product of m
l = list(range(n))
random.shuffle(l)
one_places = [l[m*i:m*(i+1)] for i in range(n/m)]
ret = [[0]*n for _ in range(n/m)] # create lists with zeros
# now insert ones where we want
for i, p in enumerate(one_places):
for j in p:
ret[i][j] = 1
return ret
我想制作一个掩码,它可以让我在给定的数据结构中取某些值,而不会重复位置:
例如,如果我有:
[0,0,0,0,1,1]
随机选择的排列之一是:
[1,1,0,0,0,0]
我希望数组中的位置 0 和 1 不用于下一个排列:
[1,0,0,0,0,1] 不应被允许,因为位置 0 已被使用。
[0,0,1,0,0,1] 应该是允许的,因为位置 0 和位置 1 没有被使用。
而对于下一个排列,它不能占据位置2和5,因为第二个排列已经占据了它,所以剩下的唯一选择是:
[0,0,0,1,1,0]
我不知道是否有内置函数可以让我这样做:
fun(value_options=[0,0,0,0,1,1], number_of_combinations_to_take=3)
# Output:
[ [1,1,0,0,0,0], [0,0,1,0,0,1], [0,0,0,1,1,0] ]
提前致谢,祝您有愉快的一天
PS:这个函数的objective就是有很多排列组合让我可以这样做:
a, b, c, d, e, f = [1,1,0,0,0,0]
Node(p +jump*a, p + jump*b, p + jump*c, p + jump*d, p + jump*e, p + jump*f)
所以我只能在某个方向移动函数。
考虑到这些限制,与其生成一个详尽的排列列表然后在事后过滤它,我认为通过打乱索引列表并从该列表中弹出元素来解决这个问题更有意义(没有重复)来生成掩码。
>>> import random
>>> def fun(v, n):
... i = list(range(len(v)))
... random.shuffle(i)
... m = sum(v)
... r = []
... for _ in range(n):
... p = [0] * len(v)
... for _ in range(m):
... p[i.pop()] = 1
... r.append(p)
... return r
...
>>> fun([0, 0, 0, 0, 1, 1], 3)
[[0, 0, 0, 1, 0, 1], [0, 0, 1, 0, 1, 0], [1, 1, 0, 0, 0, 0]]
Sam 先于我,但如果这对你有帮助
def fun(n, m=2):
assert n % m == 0 # n has to be a product of m
l = list(range(n))
random.shuffle(l)
one_places = [l[m*i:m*(i+1)] for i in range(n/m)]
ret = [[0]*n for _ in range(n/m)] # create lists with zeros
# now insert ones where we want
for i, p in enumerate(one_places):
for j in p:
ret[i][j] = 1
return ret