簡體   English   中英

python中字符串的所有可能的長度k組合

[英]all possible length k combinations of a string in python

我想獲得長度為k的字符串中字母的所有可能組合。 我知道有很多關於此的文章,但是我有一點扭曲k大於字符串的長度。

到目前為止,這是我所擁有的,它很簡單,並且如果k <= len(string)可以工作:

 string = 'ABCD'
 permutations = ["".join(x) for x in itertools.permutations(string, k)]

如果k = 4,則結果:

 ['ABCD', 'ABDC', 'ACBD', 'ACDB', 'ADBC', 'ADCB', 'BACD', 'BADC', 'BCAD', 'BCDA', 
'BDAC','BDCA', 'CABD', 'CADB', 'CBAD', 'CBDA', 'CDAB', 'CDBA', 'DABC', 'DACB', 
'DBAC', 'DBCA', 'DCAB', 'DCBA']

這按預期工作。 但是,我希望這四個字母與k> len(string)的所有可能組合。

我想要的示例答案是:

string = 'AB'
k = 4
result = ['AAA,'ABB','AAB', 'ABA','BBB', 'BAA'.......]

提前致謝。

你可能想要

itertools.product(string, repeat=k)

代替。 試試吧! 您的描述不明確,因此無法確定。

例:

>>> import itertools
>>> for p in itertools.product("ab", repeat=3):
...     print p
('a', 'a', 'a')
('a', 'a', 'b')
('a', 'b', 'a')
('a', 'b', 'b')
('b', 'a', 'a')
('b', 'a', 'b')
('b', 'b', 'a')
('b', 'b', 'b')

根據您的評論:

我正在嘗試在一個非常大的字符串中搜索每種組合的出現次數,並查看哪種組合最常出現。

還有另一種方法可以執行您想要的操作:

def substrings(vlarge, k):
    return (vlarge[idx:idx+k] for idx in range(len(vlarge)-k+1))

def uses_only(value, chars):
    return all(ch in chars for ch in value)

def most_common(vlarge, chars, k):
    return collections.Counter(s for s in substrings(vlarge, k) if uses_only(s, chars)).most_common(1)

然后,您可以查看使這個基本概念更有效的方法:例如,如果在vlarge遇到一個'x'字符,則說明包含它的所有子字符串都不是'abcd'組合。 因此,您可以跳到x后面第一位的子字符串:

def generate_substrings(vlarge, chars, k):
    idx = 0
    goodrange = 0
    while idx <= len(vlarge) - k:
        while goodrange < idx + k:
            if vlarge[goodrange] in chars:
                goodrange += 1
            else:
                idx = goodrange + 1
                if idx > len(vlarge) - k:
                    return
                goodrange = idx
        yield vlarge[idx:goodrange]
        idx += 1

def most_common(vlarge, chars, k):
    return collections.Counter(generate_substrings(vlarge, chars, k)).most_common(1)

與這種方法相比,“顯而易見”的想法(遍歷所有組合,計算它們作為子字符串出現的次數,並跟蹤到目前為止的最佳狀態)使用的內存更少,但會慢很多 ,因為它必須在非常大的字符串上進行了大量傳遞。

如果我誤解了“組合”的含義,也就是說,如果我的uses_only函數不正確,那么您就必須相應地調整我的想法。 重點是:計算所需形式的實際子字符串,因為它們少於正確形式的假設子字符串。

我的回答只會是您正在做的事情的理論分析。 我將用C(k,n)表示二項式系數,該二項式系數定義包含n個元素的集合中包含k個元素的部分的數量。

假設你有長度為n∈ℕ*K∈ℕ的字符串,K⩾ñ。 我將假設您字符串中的所有字符都是不同的。
我了解到您正在嘗試構建從輸入字符串中提取的k個字符的字符串。

字符串字符的組合可以看作是⟦1 n⟧的排列。 n! 這樣的排列...

然后,當k> n時 ,情況變得越來越糟...令r = k mod np =(k-r)/ n 顯然,我們有:

⩾1
0⩽r <p

您的輸出字符串可以分解為n個輸入字符的排列構成的p個 “完整”子字符串,而一個子字符串僅由輸入字符串的r個字符構成。

要構建這樣的“不完整”子字符串,您首先必須選擇輸入字符串中r個字符的子集,然后對這些字符進行排列。 of such possible substrings is : 最后,此類可能的子字符串的數量為:

您可以根據自己的方案構建的k個長字符串的最終數目為:

這個數字高得離譜

k = 4n = 2時 ,我們有:

s tot =(C(0,4).0!)。(2!) 2 = 4

result = ['ABAB', 'ABBA', 'BAAB', 'BABA']

暫無
暫無

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

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