我需要找到一個更快的方法來找到一個8-11字符串的互換,以下列方式單一的交換:上的繩子
給定一個字符串'STDILGNLYE'
,找到所有的字母一個字母互換:
list_AA = ['A', 'R', 'N', 'D', 'C', 'Q', 'E', 'G', 'H', 'I', 'L', 'K', 'M',
'F', 'P', 'S', 'T', 'W', 'Y', 'V']
即,對於字符串中的每個字母,替換原字符串中的每個字母有一個在list_aa
。輸出將是:
ATDILGNLYE
RTDILGNLYE
NTDILGNLYE
...
SADILGNLYE
SRDILGNLYE
SNDILGNLYE
...
...
STDILGNLYV
對於總共200個新字符串(每個位置在字符串中每個位置20個交換)。 我有什麼至今:需要
def _create_swaps(original_str):
list_peps = []
for i in range(len(original_str)):
for k in range(len(list_AA)):
list_peps.append(_insert_aa(original_str, i, list_aa[k]))
#remove original string
return [i for i in list_peps if i != original_str]
def _insert_aa(string, index, aa):
list_string_elements = list(string)
del list_string_elements[index]
hash_string.insert(index, aa)
return "".join(hash_string)
因爲這需要重複〜10 ** 6倍,這是一個大項目最慢的一步。有沒有辦法以更快的方式找到這樣的交換(通過消除"".join
,插入,步驟/通過找到交換)?
參考:
ncalls tottime percall cumtime percall filename:lineno(function)
185275200 330.286 0.000 429.295 0.000 models.py:233(_insert_aa)
975240 147.322 0.000 616.979 0.001 models.py:225(_create_swaps)
185280201/185280197 59.137 0.000 59.138 0.000 {method 'join' of 'str' objects}
185275208 39.875 0.000 39.875 0.000 {method 'insert' of 'list' objects}
975240 21.027 0.000 21.027 0.000 models.py:231(<listcomp>)
186746064 18.516 0.000 18.516 0.000 {method 'append' of 'list' objects}
你需要發出的所有生成的字符串,或者只是指望他們? – Steve
@Steve我需要所有的字符串。正如你從'_create_swaps'的返回調用中看到的那樣,它會返回除原始字符串之外的所有創建的字符串。 –
您可能想嘗試找出一種方法,用'map()'替換其中一個操作...參見[本文](https://www.python.org/doc/essays/list2str/)循環效率...當然,性能總是比理論好,儘管... –