Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何获取一个列表的所有排序,使该列表与另一个列表相等?_Python_Algorithm_List_Sorting_Permutation - Fatal编程技术网

Python 如何获取一个列表的所有排序,使该列表与另一个列表相等?

Python 如何获取一个列表的所有排序,使该列表与另一个列表相等?,python,algorithm,list,sorting,permutation,Python,Algorithm,List,Sorting,Permutation,我有列表A和B,它们可以有重复项,例如: A = ['x', 'x', 7] B = [7, 'x', 'x'] 现在我想要所有将列表B排列成列表A的索引排列: [1, 2, 0] # because [B[1], B[2], B[0]] == A [2, 1, 0] # because [B[2], B[1], B[0]] == A 有没有办法在不重复所有可能的排列的情况下实现这一点? 我已经用过了 import itertools for p in itertools.per

我有列表A和B,它们可以有重复项,例如:

A = ['x', 'x', 7]
B = [7, 'x', 'x']
现在我想要所有将列表B排列成列表A的索引排列:

[1, 2, 0]    # because [B[1], B[2], B[0]] == A
[2, 1, 0]    # because [B[2], B[1], B[0]] == A
有没有办法在不重复所有可能的排列的情况下实现这一点? 我已经用过了

import itertools
for p in itertools.permutations(range(len(B))):
    if A == permute(B,p):

迭代所有可能的排列并检查我想要的排列,但我想更快地找到正确的排列。

您应该将问题分解为两部分:

  • 首先找到将
    B
    映射到
    a
  • 找到将B映射到自身的所有置换的集合
    S_B
那么,您正在查看的集合就是
{sigma\u 0\circ\sigma,sigma\in S\u B}

现在的问题是:我们如何确定SUB?为此,您可以观察到,如果您将集合
{0,1,2,…,n}
(在您的例子中,
n=2
)编写为
A_1\cup。。A_k
,其中每个
A_i
对应于
B
中对应于第i个元素的索引(在您的情况下,您将有
A_1={1,2}
A_2={0}
),那么
S_B
的每个元素都可以以独特的方式作为产品
tau 1\circ。。tau_k
其中每个
tau_i
都是作用于
a_i
的排列


因此,在你的例子中,
sb={id,(1,2)}
你可以采用
sigma\u0=(0,2)
。因此,您的目标集是
{(0,2),(2,0,1)}

您可以通过三个步骤完成此操作。首先,从列表B创建一个字典,其中项作为键,索引作为值。在您的情况下,列表B的字典:

B = [7, 'x', 'x']

  7 - [0]
'x' - [1, 2]
然后,遍历列表A并构建一个索引,该索引将列表A索引映射到相应的列表B索引。即:

A = ['x', 'x', 7]

0 - [1, 2]
1 - [1, 2]
2 - [0]

由此,您可以生成所有有效映射。根据上面的索引,编写将生成
[1,2,0]
[2,1,0]
的代码应该很容易。My
perms
函数生成所有有效的排列。首先,我收集B中每个元素的索引,然后递归地构建并生成排列,方法是始终为A中的每个项目选择一个仍然可用的索引,直到可以生成排列为止

from collections import defaultdict

def perms(A, B):
    indexes = defaultdict(set)
    for i, e in enumerate(B):
        indexes[e].add(i)
    def find(perm):
        k = len(perm)
        if k == len(A):
            yield perm
            return
        I = indexes[A[k]]
        for i in list(I):
            I.remove(i)
            yield from find(perm + (i,))
            I.add(i)
    yield from find(())
用法:

A = ['x', 'x', 7]
B = [7, 'x', 'x']

for perm in perms(A, B):
    print(perm)
输出:

(1, 2, 0)
(2, 1, 0)
130524
130542
310524
310542

这里是Python中的一些东西。我使用字符串进行散列,因为我不熟悉如何在Python中将集合和数组作为递归参数传递,尽管它们可能更有效

A = ['x', 'x', 7, 'y', 8, 8]
B = [7, 'x', 8, 'x', 8, 'y']
H = {}

# record the indexes of elements in B
for i in xrange(0,len(B)):
  if B[i] in H:
    H[ B[i] ].append(str(i)) 
  else:
    H[ B[i] ] = [str(i)]

# build permutations in the order that the elements are encountered in A
def perms(perm,i,visited,l):
  if i==l:
    print perm
    return
  for j in H[ A[i] ]:
    if j not in visited:
      perms(perm + j,i + 1,visited + j,l)

perms("",0,"",len(A)) 
输出:

(1, 2, 0)
(2, 1, 0)
130524
130542
310524
310542

我建议您在问题中添加标记“algorithm”。您的问题非常不清楚。您尝试过什么吗?您只是想找到数组的所有排列吗?我对顺序
[b,a,a]
非常困惑,因为您将a定义为两个不同的值<代码>[0,1,2]@这是个奇怪的问题。这有关系吗?我理解问输入是否总是特别的,但不是问输入是否总是不特别的…谢谢,这就像一个魅力!注意:使用Python2.7时:将find(())中的p的
yield替换为
:yield p