ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python-如何获取列表的所有顺序,以使该列表等于另一个列表?

2019-11-20 06:58:49  阅读:270  来源: 互联网

标签:list permutation python algorithm sorting


我有列表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中的每个项目选择一个仍可用的索引,直到准备产生排列为止.

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)

标签:list,permutation,python,algorithm,sorting
来源: https://codeday.me/bug/20191120/2042322.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有