[英]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 n和p =(k-r)/ n 。 顯然,我們有:
⩾1
0⩽r <p
您的輸出字符串可以分解為n個輸入字符的排列構成的p個 “完整”子字符串,而一個子字符串僅由輸入字符串的r個字符構成。
要構建這樣的“不完整”子字符串,您首先必須選擇輸入字符串中r個字符的子集,然后對這些字符進行排列。 of such possible substrings is : 最后,此類可能的子字符串的數量為:
您可以根據自己的方案構建的k個長字符串的最終數目為:
這個數字高得離譜 !
當k = 4且n = 2時 ,我們有:
s tot =(C(0,4).0!)。(2!) 2 = 4
result = ['ABAB', 'ABBA', 'BAAB', 'BABA']
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.