2017-08-22 59 views
0

我正在運行一個字符串,創建大小爲10的所有子字符串,並將它們添加到字典中。這是我的代碼,習慣性的Python迭代和添加到字典

sequence_map = {} 
for i in range(len(s)): 
    sub = s[i:i+10] 
    if sub in sequence_map: 
     sequence_map[sub] += 1 
    else: 
     sequence_map[sub] = 1 

有沒有辦法做到這一點更pythonically?

另外我該如何做反向pythonically,如在通過字典進行交互和組成一個列表,其中值是等於什麼?

[k for k, v in sequence_map.items()] 
+5

是,使用一個'collections.Counter'對象。所以'sequence_map = Counter(s [i:i + 10] for range in(len(s))' –

+4

也不會忘記你真的只想迭代到range(len(s)) - 10 ' – Hamms

+5

大概你知道這不會產生全部長度爲10的所有子字符串,這是由於在Python中切片的困難性。如果你不這樣做,你會想'爲我在range(len( s) - 9)'。 –

回答

3

您可以使用defaultdict它足夠「智能」補充丟失的鑰匙需要:

from collections import defaultdict 
sequence_map = defaultdict(int) 
for i in range(len(s) - 10): 
    sub = s[i:i + 10] 
    sequence_map[sub] += 1 

至於你的問題的第二部分,你找誰呢?

[k for k, v in sequence_map.items() if v==something] 
+1

啊,打我吧!我輸入了完全相同的代碼+1 –

+0

我修改了問題有點多加一些查詢,我完全可以接受你的答案,但是我認爲你也許可以知道第二部分的答案。 –

+0

我在第二個問題中添加了一個有條件的答案。 – DyZ

2

只是爲了保持完整性,如@ juanpa.arrivillaga在評論中說,你可以使用collections.Counter輕鬆地做到這一點:

>>> from collections import Counter 
>>> s = 'abcde' * 30 # test value 
>>> sequence_map = Counter(s[i:i + 10] for i in range(len(s) - 9)) 
>>> sequence_map 
Counter({'abcdeabcde': 29, 'bcdeabcdea': 28, 'cdeabcdeab': 28, 'deabcdeabc': 28, 'eabcdeabcd': 28})