标签:permutation python algorithm
问题:我有一些数字列表,例如[1,1,2].我需要生成唯一的排列.排列为[1,1,2],[1,1,2],[1,2,1],[1,2,1],[2,1,1],[2,1,1] .我只需要生成唯一的排列,即[1,1,2],[1,2,1],[2,1,1].
我的尝试:我的第一个尝试是保留一组现有排列,并为itertools.permutations生成器创建一个过滤器,使用该过滤器过滤出重复项.但是,出于效率考虑,我宁愿先不要生成这些排列.即使只列出一小部分12个数字,也只有1%是唯一的.
我有一个想法,似乎无法一路搞定:我可以在列表中创建唯一值的排列,即[1,2],将其余数字放在所有不同的位置.
感谢您的任何帮助,并且要明确地说,我不想过滤掉重复的排列,我只想首先生成唯一的排列.
解决方法:
我从previous Stack Overflow answer改编了这段代码:
def distinct_permutations(seq):
from collections import Counter
def perm_unique_helper(item_counts, perm, i):
if i < 0:
yield tuple(perm)
else:
for item in item_counts:
if item_counts[item] <= 0:
continue
perm[i] = item
item_counts[item] -= 1
# In Python < 3.3 you can replace the yield from with a loop
yield from perm_unique_helper(item_counts, perm, i - 1)
item_counts[item] += 1
item_counts = Counter(seq)
L = len(seq)
return perm_unique_helper(item_counts, [0] * L, L - 1)
我的笔记本电脑无法使用set(permutations(seq))方法执行长度为11的输入序列,但是使用此方法可以!
标签:permutation,python,algorithm 来源: https://codeday.me/bug/20191029/1962480.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。