Python重新排列列表而不更改值并使每次重新排列都不同

丹7nm

我想编写一个获取两个整数的函数。整数表示两个字符中有多少个字符串出现在一个字符串中。

For example:
my_func(x,y): x amount of 'u' and y amount of 'r'. 
my_func(2,3) is a string 'uurrr'

该函数的目标是在不改变 x,y 数量的情况下编写该字符串的所有可能组合,并且每次重新排列都是不同的:

Example:
my_func(1,1) will return: 'ru', 'ur'
my_func(1,2) will return: 'urr', 'rur', 'rru'
my_func(2,2) will return: 'uurr', 'ruru', 'rruu','urur', 'ruur', 'urru'  

我没有涵盖所有情况的尝试:

RIGHT = 'r'
UP = 'u'
def factorial(m):
    if m>1:
        return factorial(m-1)*m
    else: 
        return 1
        
def binom(n,k):
    return int(factorial(n)/(factorial(k)*factorial(n-k)))

    
def up_and_right(n, k, lst):
    if n-k == 1 or n-k==-1 or  n-k == 0 or n==1 or k==1:
        num_of_ver = n+k
    else:
        num_of_ver = binom(n+k,2)
    first_way_to_target = RIGHT*n + UP*k
    lst.append(first_way_to_target)
    way_to_target = first_way_to_target
    for i in range(num_of_ver-1):
        for j in range(n+k-1,0,-1):
            if way_to_target[j]==UP and way_to_target[j-1]==RIGHT:
                way_to_target = list(way_to_target)
                way_to_target[j-1] = UP
                way_to_target[j] = RIGHT
                way_to_target = ''.join(way_to_target)
                lst.append(way_to_target)
                        
    return lst

提前致谢!

马克·里德

用于itertools.permutations获取所有重新排列,制作其中set的一个以消除重复项(因为例如将两个rs 围绕计数交换为单独的排列但不会改变任何内容),然后将它们重新加入字符串,因为permutations返回字符元组。

REPL 上的这个演示应该足以让您编写函数:

>>> import itertools
>>> [''.join(p) for p in set(itertools.permutations('u' * 2 + 'r' * 2))]
['uurr', 'ruur', 'ruru', 'rruu', 'urur', 'urru']

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章