在Python中查找所有可能的大小写排列

时间:2011-07-22 16:07:02

标签: python string permutation

我需要在python中列出所有可能的 case only 排列 例如,输入ar将返回 ['ar','Ar','aR','AR']
或弧形 ['arc','Arc','ARc','aRc','aRC','ARC']我知道可能有一些Nice方法,但对于我的生活,我无法理解它。

2 个答案:

答案 0 :(得分:15)

def all_casings(input_string):
    if not input_string:
        yield ""
    else:
        first = input_string[:1]
        if first.lower() == first.upper():
            for sub_casing in all_casings(input_string[1:]):
                yield first + sub_casing
        else:
            for sub_casing in all_casings(input_string[1:]):
                yield first.lower() + sub_casing
                yield first.upper() + sub_casing

>>> [x for x in all_casings("foo")]
['foo', 'Foo', 'fOo', 'FOo', 'foO', 'FoO', 'fOO', 'FOO']
>>> list(all_casings("foo"))
['foo', 'Foo', 'fOo', 'FOo', 'foO', 'FoO', 'fOO', 'FOO']

答案 1 :(得分:0)

您可以通过 zipping 大写和小写字母并采用它们的笛卡尔 product 来实现:

import itertools

chars = "abc"
results = list(map(''.join, itertools.product(*zip(chars.upper(), chars.lower()))))

print(results)
>>>['ABC', 'ABc', 'AbC', 'Abc', 'aBC', 'aBc', 'abC', 'abc']

可视化这是如何工作的:

  1. zip 正在为我们创建 3 个“轴”,每个轴有 2 个点(大写/小写):
    [('A', 'a'), 
     ('B', 'b'), 
     ('C', 'c')]
    
  2. product 取这些轴的笛卡尔积,即与它创建的单位立方体的角对应的 8 个可能坐标:
<头>
enter image description here enter image description here
1。创建轴 2.取笛卡尔积
  1. ''.join 连接元组以输出字符串:('A','B','C') -> 'ABC'