【问题标题】:Python3 permutation based on Tree Structure基于树结构的 Python3 排列
【发布时间】:2017-08-20 21:29:54
【问题描述】:

我正在尝试使用树结构来创建置换函数:

import copy
def myPermutation (newString, newDict):
    if sum(newDict.values()) == 0:
    return ' '
else:
    curDict = copy.deepcopy(newDict)
    nextDict = copy.deepcopy(newDict)
    results = []

    for i in range(len(newString)):
        curChar = newString[i]
        if curDict[curChar] == 0:
            continue
        else:
            print(curDict, ' -> ', curChar)
            nextDict[curChar] -= 1
            print(nextDict)
            for p in myPermutation(newString, nextDict):
                results.append(curChar+p)
            # myPermutation(newString, nextDict)
            # results.append(curChar)
            nextDict=copy.deepcopy(newDict)
    return results

def curDict (newString):
    myDict = dict()
    for char in newString:
        myDict[char] = myDict.get(char,0) + 1
    return myDict

newString = 'ABC'
newDict = curDict(newString)
test = myPermutation(newString, newDict)
print(test)

输出是这样的: ['ABC', 'ACB', 'BAC', 'BCA', 'CAB', 'CBA']

但如果我使用“AAB”作为测试数据,我的输出是: ['AAB','AAB','ABA','ABA','AAB','AAB','ABA','ABA','BAA','BAA','BAA','BAA']

使用树结构进行排列的全部目的是如果其中一个字符重复,我可以避免重载递归函数。 click here for "tree structure algorithm"

  1. 有人知道调整代码以使算法有效吗?
  2. 如何避免在置换函数中使用return ' '?根据我的输出,每个排列元素都有一个 SPACE。我尝试使用 '' 或 None,但编译器总是给我错误消息。

【问题讨论】:

    标签: python-3.x recursion tree permutation


    【解决方案1】:

    好的,我想通了,根据算法,我需要将 'inputString' 转换为不同的 Char 字符串,将 'AAB' 转换为 'AB' 然后将带有 dict 的不同 Char String 传递给排列函数。 这是新代码:

    import copy
    
    def myPermutation (newString, newDict):
        if sum(newDict.values()) == 0:
            return ' '
    else:
        curDict = copy.deepcopy(newDict)
        nextDict = copy.deepcopy(newDict)
        results = []
    
        for curChar in newString:
            if curDict[curChar] == 0:
                continue
            else:
                nextDict[curChar] -= 1
                for p in myPermutation(newString, nextDict):
                    results.append(curChar+p)
                nextDict=copy.deepcopy(newDict)
        return results
    
    def curDict (newString):
        myDict = dict()
        for char in newString:
            myDict[char] = myDict.get(char,0) + 1
        return myDict
    
    def myDistStr(newDict):
        myStr = ''
        for k, v in newDict.items():
            myStr = k+myStr
        return myStr
    
    newString = 'AABBC'
    newDict = curDict(newString)
    test = myPermutation(myDistStr(newDict), newDict)
    print(len(test))
    print(test)
    

    【讨论】:

      【解决方案2】:

      对于SPACE问题,我可以简单地使用:

      for items in test:
      print(items.strip(), end=' ')
      

      但是,有没有我可以直接做内部排列函数?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多