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

Python rearrange a list without changing the values and making every rearrangment different

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

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 以消除重复项(因为例如交换两个 r 算作一个单独的排列但不更改任何内容),然后将它们连接回字符串,因为 permutations returns 字符元组代替。

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

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