Python中的字符串操作(单词的所有大小写衍生词)

时间:2013-11-19 05:14:17

标签: python string

我必须读一读,并创建一个数组,该数组存储数组中此单词的大写和小写字符的每个变体。例如,单词“abc”。我需要找到一种方法来检索每个大写和小写版本的“abc”(abc,abc,ABc,ABC,AbC,abC和aBC)。该字符串还可以包含应该保留的数字。

我知道我必须在这里使用递归来获取每个变体,但我不太确定如何,或者是否有任何python库提供这种操作。

非常感谢任何帮助或提示!

5 个答案:

答案 0 :(得分:7)

from itertools import product
def randString(istr):
    l = [(c, c.upper()) if not c.isdigit() else (c,) for c in istr.lower()]
    return ["".join(item) for item in product(*l)]

print randString("aBC1")
print randString("A1b2c3")

<强>输出

['abc1', 'abC1', 'aBc1', 'aBC1', 'Abc1', 'AbC1', 'ABc1', 'ABC1']
['a1b2c3', 'a1b2C3', 'a1B2c3', 'a1B2C3', 'A1b2c3', 'A1b2C3', 'A1B2c3', 'A1B2C3']

答案 1 :(得分:5)

您可以使用Cartesian product解决此问题。给定字符串'abc',您将要将其拆分为每个位置的可能性列表,例如:

['Aa', 'Bb', 'Cc']

我会把它留给你,因为它应该很容易。完成后,您可以使用itertools.product进行所有组合。您将获得可重复的列表,例如

['A', 'b', 'C']

然后,您可以使用''.join将这些列表加在一起,获取所需的字符串。

答案 2 :(得分:4)

您可以像这样使用product。诀窍是使用集来管理没有不同的上下版本(例如数字)的任何字符。

>>> from itertools import product
>>> [''.join(x) for x in product(*[{c.upper(), c.lower()} for c in "abc"])]
['ABC', 'ABc', 'AbC', 'Abc', 'aBC', 'aBc', 'abC', 'abc']
>>> [''.join(x) for x in product(*[{(c.upper(), c.lower()} for c in "abc1"])]
['ABC1', 'ABc1', 'AbC1', 'Abc1', 'aBC1', 'aBc1', 'abC1', 'abc1']

所以

from itertools import product
def randString(s):
    return [[''.join(x) for x in product(*[{c.upper(), c.lower()} for c in s])]

您可以通过移动.lower()

来使输出更加一致
from itertools import product
def randString(s):
    return [[''.join(x) for x in product(*[{c.upper(), c} for c in s.lower()])]

答案 3 :(得分:0)

这是使用好的'递归'的解决方案:

def get_all_variations(word):
    if len(word) == 1:
        #a single character has two variations. e.g. a -> [a, A]
        return [word, word.upper()]
    else:
        #otherwise, call recursively using the left and the right half, and merge results.
        word_mid_point = len(word) // 2
        left_vars = get_all_variations(word[:word_mid_point])
        right_vars = get_all_variations(word[word_mid_point:])
        variations = []
        for left_var in left_vars:
            for right_var in right_vars:
                variations.append(left_var + right_var)
        return variations

>>> get_all_variations("abc")
['abc', 'abC', 'aBc', 'aBC', 'Abc', 'AbC', 'ABc', 'ABC']

答案 4 :(得分:-3)

如果这不是作业,你可以:

print(list(itertools.combinations('abcABC', 3)))