Есть ли способ сделать этот код более эффективным без o(n^2)

Вопрос: задан список строк с именем «string_list», который содержит:

string_list = ["darpa","da","arprpa"]

вам нужно создать новый список с именем my_list, который содержит все 3 возможные строки длины в каждом слове string_list:

my_list = ['dar', 'arp', 'rpa', 'arp', 'rpr', 'prp', 'rpa']
string_list = ["darpa","da","arprpa"]
new_list = []
for word in string_list:
    if len(word) >=3:
        i=0
        for char in word:
            if len(word[i:i+3]) == 3:
                new_list.append(word[i:i+3])
                i = i+1

print(new_list)

Мой вопрос: 1. Решил ли я это наилучшим образом? (я знаю, что это o(n^2)) 2. Какой код будет наиболее эффективным и, возможно, самым коротким для данной задачи. спасибо!


person ofirrifo    schedule 11.06.2019    source источник


Ответы (1)


Вы можете сократить его и опустить if's, если вы используете только слова длиной 3:

string_list = ["darpa","da","arprpa"]

# as list comp
k1 = [word[start:start+3] for word in string_list for start in range(len(word)-2)]

# written out
k2 = []
for word in string_list:
    lw = len(word)              
    for start in range(lw-2):  # eliminates words shorter then 3 automatically, 
                               # range(0) or less is valid but does not enter the loop
        k2.append(word[start:start+3])  # this also removes the manual counter

print(k1)         
print(k2)

Выход (идентичный):

['dar', 'arp', 'rpa', 'arp', 'rpr', 'prp', 'rpa']
person Patrick Artner    schedule 11.06.2019
comment
Я тоже думал об этом решении, вы не упомянули значение start, оно равно 0, как я сделал со своим счетчиком i? - person ofirrifo; 11.06.2019