簡體   English   中英

Python中的字符串操作(單詞的所有大小寫派生詞)

[英]String manipulation in Python (All upper and lower case derivatives of a word)

我必須讀一個單詞,然后創建一個數組,該數組在數組中存儲此單詞的大小寫字符的每個變體。 例如,單詞“ abc”。 我需要找到一種方法來檢索“ abc”的每個大寫和小寫版本(abc,Abc,ABc,ABC,AbC,abc和aBC)。 該字符串還可以包含數字,應單獨保留。

我知道我必須在這里使用遞歸以獲得所有變化,但是我不確定如何,或者是否有任何提供這種操作的python庫。

任何幫助或提示,我們將不勝感激!

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

您可以使用笛卡爾積來解決此問題。 給定字符串'abc' ,您將希望將其分成每個位置的可能性列表,例如:

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

我會把它留給你,因為它應該很容易。 一旦知道了,就可以使用itertools.product進行所有組合。 您將獲得像這樣的列表的迭代

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

然后,您可以使用''.join將這些列表連接在一起,以獲得所需的字符串。

您可以使用這樣的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()])]

這是使用良好的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

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

如果這不是家庭作業,則可以:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM