【问题标题】:Python recursive permutation, fixed first elementPython递归排列,固定第一个元素
【发布时间】:2020-11-18 13:04:35
【问题描述】:

我正在对具有固定第一个元素的递归排列进行练习。在每次排列(Fruit1 Fruit2 Fruit3 Fruit4 Fruit5)之后,我需要一个具有特定格式的打印件,并且第一个元素始终相同。我找不到这个特定排列问题的答案,因此,我提出了一个新问题。我尝试使用两种替代方法来解决,但是,第一种方法不断将元素添加到同一个结果列表中,另一种方法导致 typeError。出了什么问题以及修复代码需要什么。 注意:我可以用 itertools.permutations 完成它;或与所有元素的排列;或者先使用四个元素,然后在打印时添加第一个元素; 在这里我想问一下这个特定的功能需要如何纠正?

fruits = ["Apple", "Banana", "Orange", "Peach", "Avocado"]

def permutation(menu, lst):

    if len(lst) == 0:
        
        #here prints of each permutation
            
        print(' '.join([fruits[i] for i in menu]))
        
        return []

    
      ##the first try which gives the permutations
       ##as ever expanding list
    for i in range(len(lst)):

       fruit = lst[i]
       
       menu.append(fruit)
       
       remLst = lst[:i] + lst[i+1:]
     
       permutation(menu, remLst)
       
       
       ##the second option which gives TypeError:
           ##can only concatenate list (not "int") to list
           ##this is alternative to the one above NOT in the same function
       
      
    for i in range(len(lst)):

        fruit = lst[i]
       
        remLst = lst[:i] + lst[i+1:]
        
  
        for p in permutation(menu, remLst):
            
            menu.append([fruit] + p)
           
    return menu


permutation([0], list(range(1, len(fruits))))

【问题讨论】:

  • 你想要的输出是什么?你能举个例子吗?
  • 如果您只使用长度,您创建列表的目的是什么? (第二个参数)为什么你从函数中引用水果?这样,您的功能将仅限于该列表,并且永远不能用于其他用途。
  • 期望的输出是:Apple Banana Orange Peach Avocado \n Apple Banana Orange Avocado Peach \n Apple Banana Peach Avocado Orange \n etc.
  • 我稍后用它来计算水果的一些变量...

标签: python permutation


【解决方案1】:

由于您希望第一个元素是固定的,假设是“Apple”,我将其从“fruit”中丢弃并找到其余水果的排列并将每个排列添加到 `["Apple"] 列表中。

fruits = ["Apple", "Banana", "Orange", "Peach", "Avocado"]
fixed=fruits[1:]
class Solution:
      def permute(self, fruits):
        result = []
        def dfs(fruits,path):
            if len(fruits) == 0:
                result.append(path)
                return
            for i in range(len(fruits)):
                dfs(fruits[:i] + fruits[i + 1:], path + [fruits[i]])

        dfs(fixed,['Apple'])
        return result
s=Solution()
s.permute(fixed)

【讨论】:

    【解决方案2】:

    您可以只删除固定元素,然后在其余元素上创建排列并将固定添加到结果中,如下所示:

    from itertools import permutations
    
    fruits = ["Apple", "Banana", "Orange", "Peach", "Avocado"]
    fixed_index= 2 # "Orange"
    fixed_element= fruits[fixed_index]
    # create a temporary list with all elements that still are
    # missing in the permutation
    rest_elements= fruits[:fixed_index] + fruits[fixed_index+1:]
    for permutation in permutations(rest_elements):
        print((fixed_element,) + permutation)
    

    结果是:

    ('Orange', 'Apple', 'Banana', 'Peach', 'Avocado')
    ('Orange', 'Apple', 'Banana', 'Avocado', 'Peach')
    ('Orange', 'Apple', 'Peach', 'Banana', 'Avocado')
    ('Orange', 'Apple', 'Peach', 'Avocado', 'Banana')
    ('Orange', 'Apple', 'Avocado', 'Banana', 'Peach')
    ('Orange', 'Apple', 'Avocado', 'Peach', 'Banana')
    ('Orange', 'Banana', 'Apple', 'Peach', 'Avocado')
    ('Orange', 'Banana', 'Apple', 'Avocado', 'Peach')
    ('Orange', 'Banana', 'Peach', 'Apple', 'Avocado')
    ('Orange', 'Banana', 'Peach', 'Avocado', 'Apple')
    ('Orange', 'Banana', 'Avocado', 'Apple', 'Peach')
    ('Orange', 'Banana', 'Avocado', 'Peach', 'Apple')
    ('Orange', 'Peach', 'Apple', 'Banana', 'Avocado')
    ('Orange', 'Peach', 'Apple', 'Avocado', 'Banana')
    ('Orange', 'Peach', 'Banana', 'Apple', 'Avocado')
    ('Orange', 'Peach', 'Banana', 'Avocado', 'Apple')
    ('Orange', 'Peach', 'Avocado', 'Apple', 'Banana')
    ('Orange', 'Peach', 'Avocado', 'Banana', 'Apple')
    ('Orange', 'Avocado', 'Apple', 'Banana', 'Peach')
    ('Orange', 'Avocado', 'Apple', 'Peach', 'Banana')
    ('Orange', 'Avocado', 'Banana', 'Apple', 'Peach')
    ('Orange', 'Avocado', 'Banana', 'Peach', 'Apple')
    ('Orange', 'Avocado', 'Peach', 'Apple', 'Banana')
    ('Orange', 'Avocado', 'Peach', 'Banana', 'Apple')
    

    如果你想创建一个不使用itertools的递归函数,你可以这样做:

    def create_permutations(base_list, prefix_list):
        result_list= list()
        # create a temporary list with all elements that still are
        # missing in the permutation
        remaining_elements= [el for el in base_list if el not in prefix_list]
        num_remaining= len(remaining_elements)
        if num_remaining == 0:
            # the prefix is a full permutation --> nothing to permute left
            result_list.append(tuple(prefix_list))
        else:
            # recursively create the rest of the permutations prefixed
            # by the old prefix extended by element el
            # and add the permutations to the result list
            for el in remaining_elements:
                result_list.extend(tuple(create_permutations(base_list, prefix_list + [el])))
        return result_list
    
    create_permutations(fruits, [])
    

    这会返回:

    [('Apple', 'Banana', 'Orange', 'Peach', 'Avocado'),
     ('Apple', 'Banana', 'Orange', 'Avocado', 'Peach'),
     ('Apple', 'Banana', 'Peach', 'Orange', 'Avocado'),
     ('Apple', 'Banana', 'Peach', 'Avocado', 'Orange'),
     ('Apple', 'Banana', 'Avocado', 'Orange', 'Peach'),
     ('Apple', 'Banana', 'Avocado', 'Peach', 'Orange'),
     ('Apple', 'Orange', 'Banana', 'Peach', 'Avocado'),
     ('Apple', 'Orange', 'Banana', 'Avocado', 'Peach'),
     ('Apple', 'Orange', 'Peach', 'Banana', 'Avocado'),
     ('Apple', 'Orange', 'Peach', 'Avocado', 'Banana'),
     ('Apple', 'Orange', 'Avocado', 'Banana', 'Peach'),
     ('Apple', 'Orange', 'Avocado', 'Peach', 'Banana'),
     ('Apple', 'Peach', 'Banana', 'Orange', 'Avocado'),
     ('Apple', 'Peach', 'Banana', 'Avocado', 'Orange'),
     ('Apple', 'Peach', 'Orange', 'Banana', 'Avocado'),
     ('Apple', 'Peach', 'Orange', 'Avocado', 'Banana'),
     ('Apple', 'Peach', 'Avocado', 'Banana', 'Orange'),
     ('Apple', 'Peach', 'Avocado', 'Orange', 'Banana'),
     ('Apple', 'Avocado', 'Banana', 'Orange', 'Peach'),
     ('Apple', 'Avocado', 'Banana', 'Peach', 'Orange'),
     ('Apple', 'Avocado', 'Orange', 'Banana', 'Peach'),
     ('Apple', 'Avocado', 'Orange', 'Peach', 'Banana'),
     ('Apple', 'Avocado', 'Peach', 'Banana', 'Orange'),
     ('Apple', 'Avocado', 'Peach', 'Orange', 'Banana'),
     ('Banana', 'Apple', 'Orange', 'Peach', 'Avocado'),
     ('Banana', 'Apple', 'Orange', 'Avocado', 'Peach'),
     ('Banana', 'Apple', 'Peach', 'Orange', 'Avocado'),
     ('Banana', 'Apple', 'Peach', 'Avocado', 'Orange'),
     ('Banana', 'Apple', 'Avocado', 'Orange', 'Peach'),
     ('Banana', 'Apple', 'Avocado', 'Peach', 'Orange'),
     ('Banana', 'Orange', 'Apple', 'Peach', 'Avocado'),
     ('Banana', 'Orange', 'Apple', 'Avocado', 'Peach'),
     ('Banana', 'Orange', 'Peach', 'Apple', 'Avocado'),
     ('Banana', 'Orange', 'Peach', 'Avocado', 'Apple'),
     ('Banana', 'Orange', 'Avocado', 'Apple', 'Peach'),
     ('Banana', 'Orange', 'Avocado', 'Peach', 'Apple'),
     ('Banana', 'Peach', 'Apple', 'Orange', 'Avocado'),
     ('Banana', 'Peach', 'Apple', 'Avocado', 'Orange'),
     ('Banana', 'Peach', 'Orange', 'Apple', 'Avocado'),
     ('Banana', 'Peach', 'Orange', 'Avocado', 'Apple'),
     ('Banana', 'Peach', 'Avocado', 'Apple', 'Orange'),
     ('Banana', 'Peach', 'Avocado', 'Orange', 'Apple'),
     ('Banana', 'Avocado', 'Apple', 'Orange', 'Peach'),
     ('Banana', 'Avocado', 'Apple', 'Peach', 'Orange'),
     ('Banana', 'Avocado', 'Orange', 'Apple', 'Peach'),
     ('Banana', 'Avocado', 'Orange', 'Peach', 'Apple'),
     ('Banana', 'Avocado', 'Peach', 'Apple', 'Orange'),
     ('Banana', 'Avocado', 'Peach', 'Orange', 'Apple'),
     ('Orange', 'Apple', 'Banana', 'Peach', 'Avocado'),
     ('Orange', 'Apple', 'Banana', 'Avocado', 'Peach'),
     ('Orange', 'Apple', 'Peach', 'Banana', 'Avocado'),
     ('Orange', 'Apple', 'Peach', 'Avocado', 'Banana'),
     ('Orange', 'Apple', 'Avocado', 'Banana', 'Peach'),
     ('Orange', 'Apple', 'Avocado', 'Peach', 'Banana'),
     ('Orange', 'Banana', 'Apple', 'Peach', 'Avocado'),
     ('Orange', 'Banana', 'Apple', 'Avocado', 'Peach'),
     ('Orange', 'Banana', 'Peach', 'Apple', 'Avocado'),
     ('Orange', 'Banana', 'Peach', 'Avocado', 'Apple'),
     ('Orange', 'Banana', 'Avocado', 'Apple', 'Peach'),
     ('Orange', 'Banana', 'Avocado', 'Peach', 'Apple'),
     ('Orange', 'Peach', 'Apple', 'Banana', 'Avocado'),
     ('Orange', 'Peach', 'Apple', 'Avocado', 'Banana'),
     ('Orange', 'Peach', 'Banana', 'Apple', 'Avocado'),
     ('Orange', 'Peach', 'Banana', 'Avocado', 'Apple'),
     ('Orange', 'Peach', 'Avocado', 'Apple', 'Banana'),
     ('Orange', 'Peach', 'Avocado', 'Banana', 'Apple'),
     ('Orange', 'Avocado', 'Apple', 'Banana', 'Peach'),
     ('Orange', 'Avocado', 'Apple', 'Peach', 'Banana'),
     ('Orange', 'Avocado', 'Banana', 'Apple', 'Peach'),
     ('Orange', 'Avocado', 'Banana', 'Peach', 'Apple'),
     ('Orange', 'Avocado', 'Peach', 'Apple', 'Banana'),
     ('Orange', 'Avocado', 'Peach', 'Banana', 'Apple'),
     ('Peach', 'Apple', 'Banana', 'Orange', 'Avocado'),
     ('Peach', 'Apple', 'Banana', 'Avocado', 'Orange'),
     ('Peach', 'Apple', 'Orange', 'Banana', 'Avocado'),
     ('Peach', 'Apple', 'Orange', 'Avocado', 'Banana'),
     ('Peach', 'Apple', 'Avocado', 'Banana', 'Orange'),
     ('Peach', 'Apple', 'Avocado', 'Orange', 'Banana'),
     ('Peach', 'Banana', 'Apple', 'Orange', 'Avocado'),
     ('Peach', 'Banana', 'Apple', 'Avocado', 'Orange'),
     ('Peach', 'Banana', 'Orange', 'Apple', 'Avocado'),
     ('Peach', 'Banana', 'Orange', 'Avocado', 'Apple'),
     ('Peach', 'Banana', 'Avocado', 'Apple', 'Orange'),
     ('Peach', 'Banana', 'Avocado', 'Orange', 'Apple'),
     ('Peach', 'Orange', 'Apple', 'Banana', 'Avocado'),
     ('Peach', 'Orange', 'Apple', 'Avocado', 'Banana'),
     ('Peach', 'Orange', 'Banana', 'Apple', 'Avocado'),
     ('Peach', 'Orange', 'Banana', 'Avocado', 'Apple'),
     ('Peach', 'Orange', 'Avocado', 'Apple', 'Banana'),
     ('Peach', 'Orange', 'Avocado', 'Banana', 'Apple'),
     ('Peach', 'Avocado', 'Apple', 'Banana', 'Orange'),
     ('Peach', 'Avocado', 'Apple', 'Orange', 'Banana'),
     ('Peach', 'Avocado', 'Banana', 'Apple', 'Orange'),
     ('Peach', 'Avocado', 'Banana', 'Orange', 'Apple'),
     ('Peach', 'Avocado', 'Orange', 'Apple', 'Banana'),
     ('Peach', 'Avocado', 'Orange', 'Banana', 'Apple'),
     ('Avocado', 'Apple', 'Banana', 'Orange', 'Peach'),
     ('Avocado', 'Apple', 'Banana', 'Peach', 'Orange'),
     ('Avocado', 'Apple', 'Orange', 'Banana', 'Peach'),
     ('Avocado', 'Apple', 'Orange', 'Peach', 'Banana'),
     ('Avocado', 'Apple', 'Peach', 'Banana', 'Orange'),
     ('Avocado', 'Apple', 'Peach', 'Orange', 'Banana'),
     ('Avocado', 'Banana', 'Apple', 'Orange', 'Peach'),
     ('Avocado', 'Banana', 'Apple', 'Peach', 'Orange'),
     ('Avocado', 'Banana', 'Orange', 'Apple', 'Peach'),
     ('Avocado', 'Banana', 'Orange', 'Peach', 'Apple'),
     ('Avocado', 'Banana', 'Peach', 'Apple', 'Orange'),
     ('Avocado', 'Banana', 'Peach', 'Orange', 'Apple'),
     ('Avocado', 'Orange', 'Apple', 'Banana', 'Peach'),
     ('Avocado', 'Orange', 'Apple', 'Peach', 'Banana'),
     ('Avocado', 'Orange', 'Banana', 'Apple', 'Peach'),
     ('Avocado', 'Orange', 'Banana', 'Peach', 'Apple'),
     ('Avocado', 'Orange', 'Peach', 'Apple', 'Banana'),
     ('Avocado', 'Orange', 'Peach', 'Banana', 'Apple'),
     ('Avocado', 'Peach', 'Apple', 'Banana', 'Orange'),
     ('Avocado', 'Peach', 'Apple', 'Orange', 'Banana'),
     ('Avocado', 'Peach', 'Banana', 'Apple', 'Orange'),
     ('Avocado', 'Peach', 'Banana', 'Orange', 'Apple'),
     ('Avocado', 'Peach', 'Orange', 'Apple', 'Banana'),
     ('Avocado', 'Peach', 'Orange', 'Banana', 'Apple')]
    

    但它适用于任意长前缀,例如:

    create_permutations(fruits, ['Orange', 'Banana'])
    # which returns:
    [('Orange', 'Banana', 'Apple', 'Peach', 'Avocado'),
     ('Orange', 'Banana', 'Apple', 'Avocado', 'Peach'),
     ('Orange', 'Banana', 'Peach', 'Apple', 'Avocado'),
     ('Orange', 'Banana', 'Peach', 'Avocado', 'Apple'),
     ('Orange', 'Banana', 'Avocado', 'Apple', 'Peach'),
     ('Orange', 'Banana', 'Avocado', 'Peach', 'Apple')]
    

    【讨论】:

    • 嗨!感谢您的答复!这当然有效。但是如果需要在 def 置换内部打印两个参数发送到函数中怎么办?
    • 什么意思?你想打印什么参数?我添加了另一种没有itertools的递归方式。
    • 谢谢@jottbe!没有 itertools 的第二个选项很棒。它提供了正确的工具来继续我的任务。
    • 我很高兴能帮上忙。
    猜你喜欢
    • 2012-08-22
    • 2018-10-25
    • 2018-08-15
    • 2023-03-18
    • 1970-01-01
    • 2012-10-18
    • 2016-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多