Eu tenho uma lista de números como [1,2,3,4,5...]
, e quero calcular (1+2)/2
e para o segundo (2+3)/2
e o terceiro
(3+4)/2
, e assim por diante. Como eu posso fazer isso?
Gostaria de somar o primeiro número com o segundo e dividi-lo por 2, depois somar o segundo com o terceiro e dividir por 2, e assim por diante.
Além disso, como posso somar uma lista de números?
a = [1, 2, 3, 4, 5, ...]
É isso:
b = sum(a)
print b
obter um número?
Isso não funciona para mim.
Respostas:
Pergunta 1: Então você deseja (elemento 0 + elemento 1) / 2, (elemento 1 + elemento 2) / 2, ... etc.
Fazemos duas listas: uma de cada elemento, exceto o primeiro, e uma de cada elemento, exceto o último. Então as médias que queremos são as médias de cada par extraído das duas listas. Nós usamos
zip
pares de duas listas.Suponho que você queira ver decimais no resultado, mesmo que seus valores de entrada sejam inteiros. Por padrão, o Python faz divisão inteira: descarta o restante. Para dividir as coisas, precisamos usar números de ponto flutuante. Felizmente, dividir um int por um float produzirá um float; portanto, usamos apenas
2.0
para o nosso divisor em vez de2
.Portanto:
Questão 2:
Esse uso de
sum
deve funcionar bem. Os seguintes trabalhos:Além disso, você não precisa atribuir tudo a uma variável a cada passo do caminho.
print sum(a)
funciona muito bem.Você precisará ser mais específico sobre exatamente o que escreveu e como não está funcionando.
fonte
my_list
é definido apenas se você o definir. Isso deveria ser um espaço reservado para o que você chamou de lista com a qual está tentando trabalhar. Não consigo adivinhar o que você chamou.a
".zip
para quando chega ao final do argumento mais curto,zip(my_list, my_list[1:])
é suficiente.Soma da lista de números:
Calculando metade de n e n - 1 (se eu tiver o padrão correto), usando uma compreensão de lista :
Soma elementos adjacentes, por exemplo, ((1 + 2) / 2) + ((2 + 3) / 2) + ... usando reduzir e lambdas
fonte
x
ex - 1
; podemos apenas subtrair 0,5.from functools import reduce
Pergunta 2: Para somar uma lista de números inteiros:
Se a lista contiver números inteiros como seqüências de caracteres:
fonte
sum(i for i in a)
é apenas redundante.sum(Decimal(i) for i in a)
=>sum(int(i) for i in a)
ousum(map(int,a))
Você pode tentar desta maneira:
fonte
a[0:len(a)]
cria uma cópia dea
, qual é o objetivo além de desperdiçar CPU e memória? entãoprint(sm)
também funciona no python 2. Não entendo por que isso tem tantos votos positivos em meados de 2017 ... mas se aplica à maioria das respostas aqui.Parece que
sum
foi definido no código em algum lugar e substitui a função padrão. Então eu apaguei e o problema foi resolvido.fonte
Usando um simples
list-comprehension
e osum
:fonte
[
e]
, você pode apenas passar o gerador de expressãosum(i/2. for i in range(x))
sum(range(x)) / 2.
evita todas as divisões, basta dividir no final.Todas as respostas mostraram uma abordagem programática e geral. Sugiro uma abordagem matemática específica para o seu caso. Pode ser mais rápido, em especial para listas longas. Funciona porque sua lista é uma lista de números naturais até
n
:Vamos supor que temos os números naturais
1, 2, 3, ..., 10
:Você pode usar a
sum
função em uma lista:Você também pode usar a fórmula
n*(n+1)/2
onden
está o valor do último elemento na lista (aquinat_seq[-1]
:), para evitar a iteração sobre os elementos:Para gerar a sequência,
(1+2)/2, (2+3)/2, ..., (9+10)/2
você pode usar um gerador e a fórmula(2*k-1)/2.
(observe o ponto para tornar os valores pontos flutuantes). Você precisa pular o primeiro elemento ao gerar a nova lista:Aqui também, você pode usar a
sum
função nessa lista:Mas você também pode usar a fórmula
(((n*2+1)/2)**2-1)/2
, para evitar a iteração sobre os elementos:fonte
A maneira mais simples de resolver esse problema:
fonte
Esta pergunta foi respondida aqui
fonte
fonte
Os geradores são uma maneira fácil de escrever isso:
fonte
Vamos facilitar para o Iniciante: -
global
palavra-chave permitirá que a mensagem da variável global seja atribuída na função principal sem produzir uma nova variável localEsse conceito é chamado de sombreamento
Saídas = 15
fonte
Usando a
pairwise
receita de itertools :fonte
Curto e simples:
E aqui está como fica:
Devido a alguma estupidez em como o Python lida com
map
mais de duas listas, você precisa truncar a listaa[:-1]
,. Funciona mais como você esperaria se você usasseitertools.imap
:fonte
Tantas soluções, mas o meu favorito ainda está faltando:
uma matriz numpy não é muito diferente de uma lista (nesse caso de uso), exceto que você pode tratar matrizes como números:
Feito!
explicação
Os índices extravagantes significam o seguinte:
[1:]
inclui todos os elementos de 1 até o final (omitindo, assim, o elemento 0) e[:-1]
são todos os elementos, exceto o último:Portanto, a adição desses dois fornece uma matriz composta por elemens (1 + 2), (2 + 3) e assim por diante. Não que eu esteja dividindo
2.0
, não2
porque de outra forma o Python acredita que você está usando apenas números inteiros e produz resultados inteiros arredondados.vantagem de usar numpy
Numpy pode ser muito mais rápido do que fazer laços nas listas de números. Dependendo do tamanho da sua lista, várias ordens de magnitude são mais rápidas. Além disso, é muito menos código e, pelo menos para mim, é mais fácil de ler. Estou tentando criar o hábito de usar numpy para todos os grupos de números, e é uma grande melhoria para todos os loops e loops dentro de loops que eu teria que fazer.
fonte
Eu apenas usaria um lambda com map ()
fonte
Eu uso um
while
loop para obter o resultado:fonte
Faça um loop pelos elementos da lista e atualize o total da seguinte maneira:
fonte
Graças a Karl Knechtel, consegui entender sua pergunta. Minha interpretação:
Primeira pergunta usando a função anônima (também conhecida como função Lambda):
Segunda pergunta também usando a função anônima (também conhecida como função Lambda):
Ambas as perguntas combinadas em uma única linha de código:
use aquele que melhor se adapte às suas necessidades
fonte
Você também pode fazer o mesmo usando a recursão:
Snippet do Python:
fonte
Tente usar uma lista de compreensão. Algo como:
fonte
range(len(old_list) - 1)
), mas os Pythonistas geralmente desaprovam a combinação de 'range' e 'len'. Um corolário de "deve haver apenas uma maneira de fazê-lo" é "a biblioteca padrão fornece uma maneira de evitar coisas feias". A iteração indireta - repetindo uma sequência de números, para que você possa usá-los para indexar o que realmente deseja repetir - é uma coisa feia.No espírito de ferramentas. Inspiração da receita aos pares.
Exemplos:
fonte
fonte
Uma maneira simples é usar a permutação iter_tools
O resultado é:
Observe que a ordem é importante - o que significa 1, 2, 7 também é mostrado como 2, 1, 7 e 7, 1, 2. Você pode reduzir isso usando um conjunto.
fonte
No Python 3.8, o novo operador de atribuição pode ser usado
a
é uma referência em execução ao valor anterior na lista; portanto, ele é inicializado no primeiro elemento da lista e a iteração ocorre no restante da lista, atualizandoa
após o uso em cada iteração.Um iterador explícito é usado para evitar a necessidade de criar uma cópia da lista usando
my_list[1:]
.fonte
Tente o seguinte -
fonte
sum
função não difere dosum
comportamento ou nome interno. Você pode realmente excluir a definição da função da sua resposta e ela ainda funcionaria.sum
. Você recebe um A em um teste para responder à pergunta corretamente, mas as respostas do StackOverflow também precisam ser úteis para as pessoas que chegam a esta página e as respostas duplicadas não.