Есть ли способ заменить цикл for в функции groupList
лямбда-функцией, возможно, на map()
, в Python 3.
def groupList(input_list, output_list=[]):
for i, (v, w) in enumerate(zip(input_list[:-2], input_list[2:])):
output_list.append(f'{input_list[i]} {input_list[i+1]} {input_list[i+2]}')
return output_list
print(groupList(['A', 'B', 'C', 'D', 'E', 'F', 'G']))
(Выход из функции groupList
будет ['A B C', 'B C D', 'C D E', 'D E F', 'E F G']
)
Спасибо. Почему использование изменяемого контейнера в качестве аргумента по умолчанию — плохая идея?
Решение 1:
def groupList(input_list):
return [' '.join(input_list[i:i+3]) for i in range(len(input_list) - 2)]
Решение 2:
def groupList(input_list):
return list(map(' '.join, (input_list[i:i+3] for i in range(len(input_list) - 2))))
Помимо предыдущих решений, более эффективное (но менее лаконичное) решение состоит в том, чтобы сначала вычислить полную конкатенацию, а затем нарезать ее.
from itertools import accumulate
def groupList(input_list):
full_concat = ' '.join(input_list)
idx = [0]
idx.extend(accumulate(len(s) + 1 for s in input_list))
return [full_concat[idx[i]:idx[i+3]-1] for i in range(len(idx) - 3)]
Не связано, но я не рекомендую использовать изменяемый контейнер в качестве аргумента по умолчанию. Альтернативой является использование вместо этого
None
и установка пустого списка в функции.