У меня есть список чисел, например [1,2,3,4,5...]
, и я хочу вычислить (1+2)/2
и для второго, (2+3)/2
и для третьего
(3+4)/2
, и так далее. Как я могу это сделать?
Я хотел бы сложить первое число со вторым и разделить его на 2, затем сложить второе с третьим и разделить на 2, и так далее.
Кроме того, как я могу сложить список чисел?
a = [1, 2, 3, 4, 5, ...]
Это:
b = sum(a)
print b
получить один номер?
Это не работает для меня.
Ответы:
Вопрос 1: Итак, вы хотите (элемент 0 + элемент 1) / 2, (элемент 1 + элемент 2) / 2, ... и т. Д.
Мы составляем два списка: один для каждого элемента, кроме первого, и один для каждого элемента, кроме последнего. Тогда средние значения, которые мы хотим, являются средними значениями каждой пары, взятыми из двух списков. Мы используем,
zip
чтобы взять пары из двух списков.Я предполагаю, что вы хотите видеть десятичные дроби в результате, даже если ваши входные значения являются целыми числами. По умолчанию Python выполняет целочисленное деление: он отбрасывает остаток. Чтобы разделить вещи на всем пути, нам нужно использовать числа с плавающей точкой. К счастью, деление целого числа на число с плавающей точкой приведет к появлению числа с плавающей запятой, поэтому мы просто используем
2.0
вместо нашего делителя2
.Таким образом:
Вопрос 2:
Это использование
sum
должно работать нормально. Следующие работы:Кроме того, вам не нужно присваивать все переменным на каждом этапе пути.
print sum(a)
работает просто отлично.Вам нужно будет более точно указать, что именно вы написали и как это не работает.
источник
my_list
определяется только если вы его определили. Это должно было быть заполнителем для того, что вы называете списком, с которым вы пытаетесь работать. Я не могу догадаться, как ты это назвал.a
".zip
останавливается, как только достигает конца более короткого аргумента,zip(my_list, my_list[1:])
достаточно.Сумма списка номеров:
Вычисление половины n и n - 1 (если у меня правильный шаблон), используя понимание списка :
Суммировать смежные элементы, например , ((1 + 2) / 2) + ((2 + 3) / 2) + ... с помощью уменьшения и лямбды
источник
x
иx - 1
; мы могли бы просто вычесть 0,5 вместо.from functools import reduce
Вопрос 2: Подвести список целых чисел:
Если список содержит целые числа в виде строк:
источник
sum(i for i in a)
просто избыточно.sum(Decimal(i) for i in a)
=>sum(int(i) for i in a)
илиsum(map(int,a))
Вы можете попробовать так:
источник
a[0:len(a)]
создаёт копиюa
, в чем смысл тратить процессор и память? затемprint(sm)
также работает в Python 2. Я не понимаю, почему это так много голосов в середине 2017 года ... но это относится к большинству ответов здесь.Кажется, что
sum
это было определено где-то в коде и переписывает функцию по умолчанию. Таким образом я удалил это, и проблема была решена.источник
Используя простой
list-comprehension
иsum
:источник
[
и]
вы можете просто передать выражение генератораsum(i/2. for i in range(x))
sum(range(x)) / 2.
избегает всех разделений, просто разделите в конце.Все ответы показали программный и общий подход. Я предлагаю математический подход, специфичный для вашего случая. Это может быть быстрее, в частности, для длинных списков. Это работает, потому что ваш список представляет собой список натуральных чисел до
n
:Давайте предположим, что у нас есть натуральные числа
1, 2, 3, ..., 10
:Вы можете использовать
sum
функцию в списке:Вы также можете использовать формулу
n*(n+1)/2
гдеn
это значение последнего элемента в списке (здесьnat_seq[-1]
:), поэтому вы избегаете итерации по элементам:Для генерации последовательности
(1+2)/2, (2+3)/2, ..., (9+10)/2
вы можете использовать генератор и формулу(2*k-1)/2.
(отметьте точку, чтобы сделать значения с плавающей запятой). Вы должны пропустить первый элемент при создании нового списка:Здесь вы также можете использовать
sum
функцию из этого списка:Но вы также можете использовать формулу
(((n*2+1)/2)**2-1)/2
, чтобы избежать перебора элементов:источник
Самый простой способ решить эту проблему:
источник
На этот вопрос ответили здесь
источник
источник
Генераторы - это простой способ написать это:
источник
Давайте сделаем это легко для начинающих: -
global
Ключевых слов позволит сообщение глобальной переменной присваивается в основной функции , не производя новую локальную переменнуюЭта концепция называется Shadowing
Выходы = 15
источник
Используя
pairwise
рецепт itertools :источник
Коротко и просто:
А вот как это выглядит:
Из - за какой - то глупости , в том , как Python поддерживает еще
map
более двух списков, вы должны отсечь список,a[:-1]
. Это работает больше, чем вы ожидаете, если вы используетеitertools.imap
:источник
Так много решений, но мой любимый все еще отсутствует:
массив NumPy не слишком отличается от списка (в этом случае), за исключением того, что вы можете рассматривать массивы как числа:
Выполнено!
объяснение
Необычные индексы означают это:
[1:]
включает в себя все элементы от 1 до конца (таким образом, опуская элемент 0) и[:-1]
являются всеми элементами, кроме последнего:Таким образом, добавив эти два, вы получите массив, состоящий из elemens (1 + 2), (2 + 3) и так далее. Не то, что я делю
2.0
, а не2
потому , что иначе Python считает, что вы используете только целые числа и выдает округленные целочисленные результаты.Преимущество использования NumPy
Numpy может быть намного быстрее, чем циклы вокруг списков чисел. В зависимости от того, насколько велик ваш список, на несколько порядков быстрее. Кроме того, кода намного меньше, и, по крайней мере, мне его легче читать. Я пытаюсь выработать привычку использовать numpy для всех групп чисел, и это огромное улучшение для всех циклов и петель внутри петель, которые в противном случае пришлось бы делать.
источник
Я бы просто использовал лямбду с map ()
источник
Я использую
while
цикл, чтобы получить результат:источник
Переберите элементы в списке и обновите итог следующим образом:
источник
Благодаря Карлу Ннехтелю я смог понять ваш вопрос. Моя интерпретация:
Первый вопрос с использованием анонимной функции (иначе лямбда-функция):
Второй вопрос также с использованием анонимной функции (иначе лямбда-функция):
Оба вопроса объединены в одну строку кода:
используйте тот, который лучше всего соответствует вашим потребностям
источник
Вы также можете сделать то же самое, используя рекурсию:
Python Snippet:
источник
Попробуйте использовать понимание списка. Что-то вроде:
источник
range(len(old_list) - 1)
), но Pythonistas обычно недовольны сочетанием 'range' и 'len'. Следствием «должен быть только один способ сделать это» является то, что «стандартная библиотека предоставляет вам способ избежать неприятных вещей». Косвенная итерация - итерация по последовательности чисел, так что вы можете использовать эти числа для индексации того, что вы действительно хотите перебрать - это ужасная вещь.В духе itertools. Вдохновение из парного рецепта.
Примеры:
источник
источник
Простой способ - использовать перестановку iter_tools
Результат:
Обратите внимание, что порядок имеет значение - значение 1, 2, 7 также отображается как 2, 1, 7 и 7, 1, 2. Вы можете уменьшить это, используя набор.
источник
В Python 3.8 может использоваться новый оператор присваивания
a
является текущей ссылкой на предыдущее значение в списке, следовательно, оно инициализируется первым элементом списка, и итерация происходит по остальной части списка, обновляя ееa
после использования в каждой итерации.Явный итератор используется, чтобы избежать необходимости создавать копию списка с помощью
my_list[1:]
.источник
Попробуйте следующее -
источник
sum
функция не отличается от встроенногоsum
поведения или имени. Вы действительно можете удалить определение функции из своего ответа, и оно все равно будет работать.sum
. Вы получите A на тесте для правильного ответа на вопрос, но ответы StackOverflow также должны быть полезны для людей, приходящих на эту страницу, а дублированные ответы - нет.