Как уменьшить список кортежей в Python 3?

Проблема

Вход:

input_list = [(1, 2), (1, 4), (1, 6)]

Ожидаемый результат:

(3, 12)

я пытался

print(reduce(lambda a, b: (a[0] + b[0], a[1] + b[1]), input_list))

а также

print(reduce(lambda (a, b), (c, d): (a + c, b + d), input_list))

оба из них не работают из-за недопустимого синтаксиса.

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

chepner 20.04.2018 22:09

@miradulo Кажется, это вопрос о том, как это сделать конкретно с reduce и, в частности, с python 3, что предполагает, что это не связано с предлагаемыми дубликатами, в любом случае IMO.

ely 20.04.2018 22:11

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

miradulo 20.04.2018 22:12

Обновленный дубликат: NameError: имя 'reduce' не определено в Python

miradulo 20.04.2018 22:17

Ошибка ничего такого в синтаксисе вашей первой попытки; какую ошибку вы видите фактически?

chepner 20.04.2018 22:20

@miradulo Этот вопрос касается не только NameError, основанного на сокращении. Скорее, он о том, «почему этот стандартный подход« просто не работает »в Python 3, и каковы альтернативные подходы в Python 3» оба. Я не чувствую себя слишком сильно, но это очень похоже на проблему придирки вопросов, чтобы закрыть их, если мы вместо этого попытаемся сделать его дубликатом вопросов, которые либо просто об использовании сокращения, либо отдельно о проблемах NameError на основе сокращения в Python 3. Некоторые решения могут объяснить, как это сделать, вообще не требуя импорта, в то время как другие объясняют, почему существует NameError.

ely 20.04.2018 22:22

@ely Я действительно не понимаю, как ты так много черпаешь из этого вопроса. И ваш ответ не идет дальше ответа на дубликат.

miradulo 20.04.2018 22:24

@miradulo Как я уже сказал, я не чувствую себя очень сильно, но я действительно думаю, что то, что я говорю, показалось мне очевидный при первом чтении вопроса, даже когда переменная изначально была неправильно названа in. Учитывая, что он может мгновенно появиться таким образом для некоторых читателей, он, по крайней мере, предлагает не закрывать его, даже если многим это не нравится и они просто игнорируют вопрос. Мне кажется, что в наши дни просто уйти - это неэффективная тактика.

ely 20.04.2018 22:25

Пусть это будет уроком: (1) всегда запускать код перед его публикацией (2) копировать и вставлять полную фактическую трассировку.

Alex Hall 20.04.2018 22:33

@ely Я не понимаю твоих доводов в пользу того, что это вообще не дубликат. Если OP (или кто-либо с такой же проблемой) действительно должен был найти ошибку, которую они получали, это буквально заголовок повторяющегося вопроса. Следовательно, я не понимаю, как этот вопрос или ответ добавляют какую-либо ценность. Если только один из них не суммирует кортежи, не импортируйте functools.reduce и не выполняйте правильный поиск с их ошибкой. Но в любом случае, я думаю, согласен не согласиться.

miradulo 20.04.2018 23:15

@miradulo Думаю, я вижу разницу между «почему возникает именно это исключение» и «почему этот код, который выполняет то, что я хочу в Python 2, не дает результата в Python 3, и каковы различные возможные решения» . На последний вопрос один ответ мог бы объяснить functools.reduce, хотя вопрос, в основном, не связан с конкретным явлением простого reduce, генерирующего NameError (это всего лишь одна часть, другая - любой другой способ решить ту же проблему, изменив Код Python 2 для другой работы в Python 3).

ely 21.04.2018 01:33

Более того, моя (меньшинство) интерпретация многих рекомендаций Stack Overflow заключается в том, что мы должны просто попытаться помочь людям и, как правило, просто не очень беспокоиться о том, какой уровень усилий они вкладывают в вопрос. Раньше я чувствовал себя иначе, но после долгого использования сайта мне просто хочется помогать людям, даже когда они стыдно просто просят ответа. На самом деле я не думаю, что все предполагаемые недостатки простой помощи им на самом деле значимы, поэтому я обычно подхожу к вопросам с точки зрения того, что их почти никогда не следует закрывать для дублирования или усилий.

ely 21.04.2018 01:36
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
12
1 017
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В Python 3 reduce перемещен из builtins в functools, поэтому вам понадобится from functools import reduce.

Это даст NameError, а не SyntaxError.

chepner 20.04.2018 22:12

@chepner У нас никогда не было подтверждения, что это действительно был SyntaxError, только «сбой из-за неправильного синтаксиса», который мог быть человеческой интерпретацией различных типов ошибок.

ely 20.04.2018 22:14

У нас также нет никаких подтверждений того, что код не предшествует from functools import reduce.

chepner 20.04.2018 22:14

@chepner Но связь с Python 3 дает некоторые доказательства того, что это часть проблемы, поэтому мои последующие убеждения о том, почему у этого человека возникают проблемы, будут иметь некоторую плотность в объяснениях, которые включают этот фактор.

ely 20.04.2018 22:15

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

David 20.04.2018 22:28

Другие вопросы по теме