【问题标题】:How to get all permutations of letters as well as case for a string in python? [duplicate]如何在python中获取字母的所有排列以及字符串的大小写? [复制]
【发布时间】:2014-07-08 03:34:08
【问题描述】:

如何在python中获取所有可能的大小写组合以及字符串的字母?

例子

输入:'ab' 输出:aB', 'Ba', 'BA', 'Ab', 'AB', 'bA'

输入 : 'dan' 输出:aND', 'ANd', 'Dna', 'naD', 'DaN', 'aDn', 'Adn' , 'dnA', 'NdA', 'andD', 'DnA', 'NAD', 'nAD', 'Dan', 'NDA', 'nAd', 'AdN', 'DAn', 'AnD', '和','DNA','daN','adN','nDa','dAN','dNa','aDN','ADN','dNA','Nda','AND','DNA' , 'NaD', 'Nad', 'aNd', 'nDA', 'dAn', 'NAd', 'ndA', 'NDa', 'ADn', 'DAN'

【问题讨论】:

  • 我不认为这是第一个的重复,因为它包括大小写;或者第二个,因为它不仅仅包含大小写。但我承认我不明白为什么似乎排除了全小写输出,所以我一定遗漏了一些东西。

标签: python case permutation letters


【解决方案1】:

结合itertools.permutationsitertools.product

from itertools import permutations, product

def perm_with_case(word):
    cased = product(*zip(word.lower(), word.upper()))
    next(cased) # throw away the all-lowercase result
    return (''.join(p) for w in cased for p in permutations(w))

给予

>>> list(perm_with_case("ab"))
['aB', 'Ba', 'Ab', 'bA', 'AB', 'BA']
>>> list(perm_with_case("dan"))
['daN', 'dNa', 'adN', 'aNd', 'Nda', 'Nad', 'dAn', 'dnA', 'Adn', 'And', 'ndA', 'nAd', 'dAN', 'dNA', 'AdN', 'ANd', 'NdA', 'NAd', 'Dan', 'Dna', 'aDn', 'anD', 'nDa', 'naD', 'DaN', 'DNa', 'aDN', 'aND', 'NDa', 'NaD', 'DAn', 'DnA', 'ADn', 'AnD', 'nDA', 'nAD', 'DAN', 'DNA', 'ADN', 'AND', 'NDA', 'NAD']

这似乎与所需的输出相匹配,尽管我承认我不明白为什么我们要扔掉全小写的值。

【讨论】:

    【解决方案2】:

    您可以使用 itertools.product 函数来完成。在https://docs.python.org/2/library/itertools.html 阅读有关它的信息

    这是一个例子:

    def combos(s):
        combolist = []
        for i in range(len(s)):
            combolist.append([])
        for i in range(len(s)):
            combolist[i].append(s[i].lower())
            combolist[i].append(s[i].upper())
        return list(itertools.product(*combolist))
    

    有输出:

    combos('ab')
    >>> [('a', 'b'), ('a', 'B'), ('A', 'b'), ('A', 'B')]
    combos('dan')
    >>> [('d', 'a', 'n'), ('d', 'a', 'N'), ('d', 'A', 'n'), ('d', 'A', 'N'), ('D', 'a', 'n'), ('D', 'a', 'N'), ('D', 'A', 'n'), ('D', 'A', 'N')]
    

    可以从那里轻松格式化。

    【讨论】:

      【解决方案3】:

      这可以使用 itertools 完成

      from itertools import permutations
      def perm(word):
          perms = [''.join(p) for p in permutations(word)]
          print(perms)
          return perms
      
      def capPer(arrPerm):
          result=[]
          for val in arrPerm:
              wordList=list(val)
      
              for i,letter in enumerate(wordList):
                  wordList[i]=letter.upper()
                  result.extend(perm(''.join(wordList)))
          return set(result)
      
      def combi(wrd):
          print(capPer(perm(wrd)))
      
      
      combi('ab')
      combi('dan')
      
      **output:**
      set(['aB', 'Ba', 'BA', 'Ab', 'AB', 'bA'])
      set(['aND', 'ANd', 'Dna', 'naD', 'DaN', 'aDn', 'Adn', 'dnA', 'NdA', 'anD', 'DnA', 'NAD', 'nAD', 'Dan', 'NDA', 'nAd', 'AdN', 'DAn', 'AnD', 'And', 'DNA', 'daN', 'adN', 'nDa', 'dAN', 'dNa', 'aDN', 'ADN', 'dNA', 'Nda', 'AND', 'DNa', 'NaD', 'Nad', 'aNd', 'nDA', 'dAn', 'NAd', 'ndA', 'NDa', 'ADn', 'DAN'])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-16
        • 2022-01-25
        • 1970-01-01
        • 1970-01-01
        • 2018-04-03
        • 1970-01-01
        相关资源
        最近更新 更多