Переписать код для использования списочных представлений для суммирования значений в начальном списке - PullRequest
0 голосов
/ 20 января 2020

Я написал этот код:

rand_map, lst = [2, 2, 6, 6, 8, 11, 4], []

for i in range(len(rand_map)):

    num = rand_map[i]
    lst.append(num)

    for j in range(i+1, len(rand_map)):
        assembly = num + rand_map[j]
        num += rand_map[j]
        lst.append(assembly)
print(sorted(lst))

, который дает такой вывод:

[2, 2, 4, 4, 6, 6, 8, 8, 10, 11, 12, 14, 14, 15, 16, 19, 20, 22, 23, 24, 25, 29, 31, 33, 35, 35, 37, 39]

Я пытался переписать этот код, используя списочные выражения, но я не секрет производства. Я пробовал несколько способов (стандартный и itertools), но я просто не могу сделать это правильно. Я буду очень благодарен за вашу помощь!

1 Ответ

1 голос
/ 20 января 2020

Я предложил несколько подходов к этой проблеме:

Подход 1 - Понимание списка ванили

В этом подходе мы повторяем две переменные, i и j и вычислить sum элементов между этими двумя индексами.

Код:

>>> rand_map = [2, 2, 6, 6, 8, 11, 4]
>>> sorted([sum(rand_map[i:i+j+1]) for i in range(len(rand_map)) for j in range(len(rand_map)-i)])
[2, 2, 4, 4, 6, 6, 8, 8, 10, 11, 12, 14, 14, 15, 16, 19, 20, 22, 23, 24, 25, 29, 31, 33, 35, 35, 37, 39]

Подход 2 - Itertools

В этом подходе мы используем рецепт itertools из здесь , чтобы выполнить итерацию по n-списку rand_map и вычислить соответствующие суммы. Это работает примерно так же, как и в первом подходе, но немного сложнее.

Код:

from itertools import islice

def n_wise(iterable, n):
    return zip(*(islice(iterable, i, None) for i in range(n)))

print(sorted([sum(x) for n in range(len(rand_map)) for x in n_wise(rand_map, n+1)]))

Вывод:

[2, 2, 4, 4, 6, 6, 8, 8, 10, 11, 12, 14, 14, 15, 16, 19, 20, 22, 23, 24, 25, 29, 31, 33, 35, 35, 37, 39]
...