Можете ли вы добавить оператор + = в понимание списка? - PullRequest
1 голос
/ 26 февраля 2020

В python У меня есть список строк, которые являются цифрами. Я вложил в него от l oop до go и суммирую каждое di git. Есть ли способ сделать это в понимании списка? Ниже у меня есть l oop, который работает, и список, который не работает.

num_sum должен = 1 + 1 + 8 + 9

number_list = ["1", "18", "9"]

for i in number_list:
       for j in i:
           num_sum += int(j)

# thing = [num_sum += int(j) for i in number_list for j in i]

Ответы [ 3 ]

2 голосов
/ 26 февраля 2020

Нет, вы не можете. Это синтаксическая ошибка.

Вместо этого вы можете сделать следующее:

number_list = ["1", "18", "9"]
num_sum = sum(int(i) for i in ''.join(number_list))
2 голосов
/ 26 февраля 2020

Это то, что вам нужно, я думаю?

thing = sum(int(n) for n in number_list)

Примечание: это фактически генератор, нет необходимости помещать числа в список, а затем суммировать их, поэтому вы не видите [] в скобках вызова sum().

. Или из вашего примера выглядит, что вы действительно хотите суммировать отдельные цифры:

thing = sum(int(d) for n in number_list for d in n)

Ответьте на свой вопрос, можете ли вы добавить оператор += в список, - вы могли бы, но он не имеет возвращаемого значения для всех типов. += присваивает выражению перед оператором, но само это присваивание может иметь или не иметь возвращаемое значение, которое будет добавлено в список, который вы строите в понимании. В большинстве случаев это не то, что вам нужно.

@ ShadowRanger предположил, что решение, предлагаемое @yyforbidden, может быть быстрее - это на самом деле:

import random
from timeit import timeit

number_list = [str(random.randint(1, 100)) for _ in range(100)]


def comprehension():
    return sum(int(d) for n in number_list for d in n)


def joined():
    return sum(int(d) for d in ''.join(number_list))


assert comprehension() == joined()

print(timeit(comprehension, number=10000))
print(timeit(joined, number=10000))

Результат:

0.4073738
0.3616424

Я все же предпочел бы понимание, потому что оно более буквально заявляет, что происходит, и читаемый код часто предпочтительнее выполнения кода - но ваши потребности могут отличаться.

0 голосов
/ 26 февраля 2020

Нет, но в Python 3.2+ вы можете использовать itertools.accumulate для достижения аналогичного эффекта, с chain, чтобы сгладить list из str цифр до итерируемой цифры :

from itertools import accumulate, chain

thing = list(accumulate(map(int, chain.from_iterable(number_list))))
num_sum = thing[-1]

или если вам не нужен list:

num_sum = sum(map(int, chain.from_iterable(number_list)))

В 3.8+, оператор моржа , :=, делает возможным создание list с listcomp без accumulate, хотя вы не можете использовать +=, только явное добавление и переназначение, так как := не имеет выражения на основе += эквивалент:

num_sum = 0
things = [(num_sum := num_sum + int(x)) for x in chain.from_iterable(number_list)]

# Chain not strictly necessary; could also do this though it would be a titch slower:
things = [(num_sum := num_sum + int(x)) for num in number_list for x in num]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...