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

Python中的字符串操作(单词的所有大小写派生),python,string,Python,String,我必须读入一个单词,然后创建一个数组,在数组中存储这个单词的所有大小写字符。例如“abc”一词。我需要找到一种方法来检索“abc”的每个大写和小写版本(abc、abc、abc、abc、abc、abc、abc和abc)。字符串还可能包括应单独保留的数字 我知道我必须在这里使用递归才能获得每一个变体,但我不太确定如何使用,或者是否有任何python库提供这种操作 非常感谢任何帮助或提示 如果这不是家庭作业,你可以: print(list(itertools.combinations('abcABC'

我必须读入一个单词,然后创建一个数组,在数组中存储这个单词的所有大小写字符。例如“abc”一词。我需要找到一种方法来检索“abc”的每个大写和小写版本(abc、abc、abc、abc、abc、abc、abc和abc)。字符串还可能包括应单独保留的数字

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


非常感谢任何帮助或提示

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

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

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

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

您可以使用一个。给定字符串“abc”,您需要将其拆分为每个位置的可能性列表,例如:

['Aa', 'Bb', 'Cc']
我把这件事留给你,因为这应该很容易。一旦你有了它,你可以用它来做所有的组合。你会得到一系列的列表,比如

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

然后,您可以使用
''。join
将这些列表连接在一起,得到所需的字符串。

您可以使用。给定字符串“abc”,您需要将其拆分为每个位置的可能性列表,例如:

['Aa', 'Bb', 'Cc']
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")
我把这件事留给你,因为这应该很容易。一旦你有了它,你可以用它来做所有的组合。你会得到一系列的列表,比如

['A', 'b', 'C']
然后可以使用
'.join
将这些列表连接在一起,得到所需的字符串

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']
输出

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

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

所以

通过移动
.lower()


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

所以

通过移动
.lower()


下面是一个使用良好的ol'递归的解决方案:

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


下面是一个使用良好的ol'递归的解决方案:

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



我们可以为您提供解决特定问题的提示。首先尝试实施一个解决方案。请注意,您的结果列表缺少aBc,这是故意的还是错误的?是否尝试过任何东西?这是如何“随机”的?当输入为abc1时,输出应该是什么?我们可以帮助您解决特定问题的提示。首先尝试实施一个解决方案。请注意,您的结果列表缺少aBc,这是故意的还是错误的?是否尝试了任何东西?这是如何“随机”的?当输入为abc1时,输出应该是什么?不完全正确。这将重新排列字母。输入是任何单词,而不是一组字符。第二个结果是
('a','b','a')
,它不应该在那里。如果现在删除此答案,您将得到
同伴压力
徽章:)不完全正确。这将重新排列字母。输入是任何单词,而不是一组字符。第二个结果是
('a','b','a')
,它不应该在那里。如果现在删除此答案,您将获得
同侪压力
徽章:)@icktoofay Nope。根据问题,输入可能也有数字。我们需要把它们过滤掉。数字应该是“被忽略”,而不是“被忽略”。@Tim My bad,这到底是什么意思?它们也应该包括在内?是的。据我所知,
'ab1'
应该给出
'ab1',ab1',ab1',ab1'
,这使问题复杂化。@他四个字的意思是,对于“A1b2c3”,你应该输出“A1b2c3”,“A1b2c3”等等。@icktoofay不。根据问题,输入可能也有数字。我们需要把它们过滤掉。数字应该是“被忽略”,而不是“被忽略”。@Tim My bad,这到底是什么意思?它们也应该包括在内?是的。据我所知,
'ab1'
应该给出
'ab1',ab1',ab1',ab1'
,这使问题复杂化。@他四个字的意思是,对于“A1b2c3”,你应该输出“A1b2c3”,“A1b2c3”等等。