Ir para conteúdo
Fórum Script Brasil
  • 0

Totalizar valores de registros numa lista


Lagluck

Pergunta

Boa tarde pessoal,

 

Estou com um problema que está um tanto quanto complicado para mim...

Sou iniciante em Python e estou desenvolvendo uma aplicação que pega os registros do excell e busca as linhas que possuem numero de Nota Fiscal repetidas e totaliza esses valores..

Estou partindo da ideia de que devo utilizar Loops encadeados, para que, com esta estrutura eu possa buscar cada registro da planilha que possuo, verifique se existem outros registros e caso tenha irei somar os valores, tendo que manter apenas um deles.

Já tentei diversas opções mas não tenho muita ideia de como fazer...

O formato dos registros:

 

[1.0, 40911.0, 8810.0, 1.0, 10.0, 1.0, 'Debito', 213103.0, 2849.42,'Compra', 'NFE: 014612 / 1 EMPRESA TESTE', '1126P063'," '', 'LI8150'," ''," '']


Estes campos em vermelho (por exemplo no for seria lista[9] para o valor e lista[11] para a NF) são os campos que estã envolvidos no processo de verificação.

Agradeço qualquer ajuda.

 

Abraço

 

 

Link para o comentário
Compartilhar em outros sites

11 respostass a esta questão

Posts Recomendados

  • 0
2 horas atrás, Lagluck disse:

Boa tarde pessoal,

 

Estou com um problema que está um tanto quanto complicado para mim...

Sou iniciante em Python e estou desenvolvendo uma aplicação que pega os registros do excell e busca as linhas que possuem numero de Nota Fiscal repetidas e totaliza esses valores..

Estou partindo da ideia de que devo utilizar Loops encadeados, para que, com esta estrutura eu possa buscar cada registro da planilha que possuo, verifique se existem outros registros e caso tenha irei somar os valores, tendo que manter apenas um deles.

Já tentei diversas opções mas não tenho muita ideia de como fazer...

O formato dos registros:

 

[1.0, 40911.0, 8810.0, 1.0, 10.0, 1.0, 'Debito', 213103.0, 2849.42,'Compra', 'NFE: 014612 / 1 EMPRESA TESTE', '1126P063'," '', 'LI8150'," ''," '']


Estes campos em vermelho (por exemplo no for seria lista[9] para o valor e lista[11] para a NF) são os campos que estã envolvidos no processo de verificação.

Agradeço qualquer ajuda.

 

Abraço

 

 

Pessoal..

Alguém pode consegue ajudar nessa questão?

 

Vlws ;)

Link para o comentário
Compartilhar em outros sites

  • 0

A ordem dos dados seguem um padrão certo? lista[9] e e lista[11]

Quando não houver mais dados estes campos vão estar em branco correto?

Bom se você sabe que tem um padrão em todo arquivo, precisa apenas de um loop para buscar as linhas, já que lista[9] e lista [11] vão estar sempre com os dados que você quer

Link para o comentário
Compartilhar em outros sites

  • 0
Em 08/01/2016 at 18:16, ArteEN disse:

A ordem dos dados seguem um padrão certo? lista[9] e e lista[11]

Quando não houver mais dados estes campos vão estar em branco correto?

Bom se você sabe que tem um padrão em todo arquivo, precisa apenas de um loop para buscar as linhas, já que lista[9] e lista [11] vão estar sempre com os dados que você quer

ArteEN,

 

Me perdoe a demora do reply...

Na verdade eu fiz uma ordenação em lista[11] (string da NF)...

Tentei algo do tipo:

    for i in range (0,len(lista1)):
        for j in range(i +1,len(lista1)):
            if  lista1[11] == lista2[j][11]:
                lista2[j][9] = lista1[9] + lista2[j][9]
                listaFinal.append(lista2[j])
                del lista1

Mas com certeza a logica que estou usando está incorreta, não estou conseguindo entrar num acordo aqui..

Com estes encadeados ele vai dar quebra de index ou então não percorre todos.

O que estou tentando é algo que percorra em j cada item do i, mas ao localizar, some unificando e exclua a linha que já foi verificada (que está numa lista secundaria criada pra isso).

Qualquer ajuda é muito bem vinda...

 

Vlws ;)

Link para o comentário
Compartilhar em outros sites

  • 0

Ok, eu vou fazer alguns códigos aqui para ver se te ajuda:

  1. No arquivo excel você terá todas as linhas seguindo um padrão, que é a linha que você deu de exemplo
    • [1.0, 40911.0, 8810.0, 1.0, 10.0, 1.0, 'Debito', 213103.0, 2849.42,'Compra', 'NFE: 014612 / 1 EMPRESA TESTE', '1126P063'," ", 'LI8150'," "," "]
  2. você vai buscar dois indices [9] e [11]
    • Vou apontar um detalhe:
    • O index 9 da linha é 'Compra'
    • O index 11 é '1126P063'
    • Talvez você esteja comparando index errado

Talvez arrumando estes detalhes do index já de uma diferença

Link para o comentário
Compartilhar em outros sites

  • 0
Em 08/01/2016 at 18:16, ArteEN disse:

A ordem dos dados seguem um padrão certo? lista[9] e e lista[11]

Quando não houver mais dados estes campos vão estar em branco correto?

Bom se você sabe que tem um padrão em todo arquivo, precisa apenas de um loop para buscar as linhas, já que lista[9] e lista [11] vão estar sempre com os dados que você quer

ArteEN,

 

Me perdoe a demora do reply...

Na verdade eu fiz uma ordenação em lista[11] (string da NF)...

Tentei algo do tipo:

    for i in range (0,len(lista1)):
        for j in range(i +1,len(lista1)):
            if  lista1[11] == lista2[j][11]:
                lista2[j][9] = lista1[9] + lista2[j][9]
                listaFinal.append(lista2[j])
                del lista1

Mas com certeza a logica que estou usando está incorreta, não estou conseguindo entrar num acordo aqui..

Com estes encadeados ele vai dar quebra de index ou então não percorre todos.

O que estou tentando é algo que percorra em j cada item do i, mas ao localizar, some unificando e exclua a linha que já foi verificada (que está numa lista secundaria criada pra isso).

Qualquer ajuda é muito bem vinda...

 

Vlws ;)

6 minutos atrás, ArteEN disse:

Ok, eu vou fazer alguns códigos aqui para ver se te ajuda:

  1. No arquivo excel você terá todas as linhas seguindo um padrão, que é a linha que você deu de exemplo
    • [1.0, 40911.0, 8810.0, 1.0, 10.0, 1.0, 'Debito', 213103.0, 2849.42,'Compra', 'NFE: 014612 / 1 EMPRESA TESTE', '1126P063'," ", 'LI8150'," "," "]
você vai buscar dois indices [9] e [11]
  • Vou apontar um detalhe:
O index 9 da linha é 'Compra' O index 11 é '1126P063' Talvez você esteja comparando index errado

Talvez arrumando estes detalhes do index já de uma diferença

Arlen,

 

Na vdd eu copei a linha errada aqui no forum, tinha mais um par de "" que na hora que eu cole não pus aqui...entre Compra e NFE e outro entre TESTE e o campo que mencionou...

As posições são essas mesmo...

Vou copiar a linha correta...

[1.0, 40912.0, 8810.0, 1.0, 1.0, 1.0, 'Debito         ', 213103.0, '', 3102.63, 'Compra', 'NFE: 000009110 / 002 FILMTEC', 21143010.0, '', 'LI8150', '', '']

[1.0, 40912.0, 8810.0, 1.0, 3.0, 1.0, 'Debito         ', 213103.0, '', 30.4, 'Compra', 'NFE: 012290 / 0 PENTAIR HIDRO', 21143002.0, '', 'LI8150', '', ''],
[1.0, 40912.0, 8810.0, 1.0, 3.0, 1.0, 'Debito         ', 213103.0, '', 1003.2, 'Compra', 'NFE: 012290 / 0 PENTAIR HIDRO', 21143002.0, '', 'LI8150', '', ''],
[1.0, 40912.0, 8810.0, 1.0, 3.0, 1.0, 'Debito         ', 213103.0, '', 1033.6, 'Compra', 'NFE: 012290 / 0 PENTAIR HIDRO', 21143002.0, '', 'LI8150', '', '']

Eu até consegui avançar um pouco na questão...

Mas o que esta complicado é o fato de que eu preciso unificar os valores corretamente, ou seja, enquanto o número da NF (lista1[11]) for igual ao lista2[j[11]]) eu vou somando...

O problema é que não estou conseguindo fazer com que funcione corretamente esta unificação.

Link para o comentário
Compartilhar em outros sites

  • 0

Bom como eu não tenho acesso a todos os seus dados eu fiz este código baseado ao que você mostrou, acho que esta facil para você aptar ao que deseja

 

lista = [
	[1.0, 40912.0, 8810.0, 1.0, 1.0, 1.0, 'Debito ', 213103.0, '', 3102.63, 'Compra', 'NFE: 000009110 / 002 FILMTEC', 21143010.0, '', 'LI8150', '', ''],
	[1.0, 40912.0, 8810.0, 1.0, 3.0, 1.0, 'Debito ', 213103.0, '', 30.4, 'Compra', 'NFE: 012290 / 0 PENTAIR HIDRO', 21143002.0, '', 'LI8150', '', ''],
	[1.0, 40912.0, 8810.0, 1.0, 3.0, 1.0, 'Debito ', 213103.0, '', 1003.2, 'Compra', 'NFE: 012290 / 0 PENTAIR HIDRO', 21143002.0, '', 'LI8150', '', ''],
	[1.0, 40912.0, 8810.0, 1.0, 3.0, 1.0, 'Debito ', 213103.0, '', 1033.6, 'Compra', 'NFE: 012290 / 0 PENTAIR HIDRO', 21143002.0, '', 'LI8150', '', '']
]


valor = 0

for i in range(len(lista)):
    for j in range(i + 1, len(lista)):
        print("\n{}\nVerificando linha '{}' com linha '{}'".format('-' * 40, i, j))
        
        if lista[i][11] == lista[j][11]:
            print("NFE identica")
            print("\nSomando {} ao valor total".format(lista[i][9]))
            
            valor += lista[i][9]
            
            print("Parcial {}".format(valor))
            
            
print("\n\n{}\nValor final: {}".format('=' * 40, valor))

 

 

Editado por ArteEN
formatar o código devidamente
Link para o comentário
Compartilhar em outros sites

  • 0
4 minutos atrás, ArteEN disse:

Bom como eu não tenho acesso a todos os seus dados eu fiz este código baseado ao que você mostrou, acho que esta facil para você aptar ao que deseja

 



 

lista = [

[1.0, 40912.0, 8810.0, 1.0, 1.0, 1.0, 'Debito ', 213103.0, '', 3102.63, 'Compra', 'NFE: 000009110 / 002 FILMTEC', 21143010.0, '', 'LI8150', '', ''],

[1.0, 40912.0, 8810.0, 1.0, 3.0, 1.0, 'Debito ', 213103.0, '', 30.4, 'Compra', 'NFE: 012290 / 0 PENTAIR HIDRO', 21143002.0, '', 'LI8150', '', ''],

[1.0, 40912.0, 8810.0, 1.0, 3.0, 1.0, 'Debito ', 213103.0, '', 1003.2, 'Compra', 'NFE: 012290 / 0 PENTAIR HIDRO', 21143002.0, '', 'LI8150', '', ''],

[1.0, 40912.0, 8810.0, 1.0, 3.0, 1.0, 'Debito ', 213103.0, '', 1033.6, 'Compra', 'NFE: 012290 / 0 PENTAIR HIDRO', 21143002.0, '', 'LI8150', '', '']

]

 

valor = 0

for i in range(len(lista)):

for j in range(i + 1, len(lista)):

print("\n{}\nVerificando linha '{}' com linha '{}'".format('-' * 40, i, j))

if lista[11] == lista[j][11]:

print("NFE identica")

print("\nSomando {} ao valor total".format(lista[9]))

valor += lista[9]

print("Parcial {}".format(valor))

  print("\n\n{}\nValor final: {}".format('=' * 40, valor))

 

Vou testar esse Arlen,

 

De qualquer modo já agradeço sua ajuda...

 

Att.:

Link para o comentário
Compartilhar em outros sites

  • 0
Em 11/01/2016 at 20:12, ArteEN disse:

Da uma olhada no codigo novamente, tem alguns erros, que corrigi

Arlen,

 

Terminei o código e deu tudo certo...

Primeiramente gostaria de agradecer demais pela sua grande ajuda, foi realmente fui valiosa para eu entender o que deveria fazer a partir dali...

Estou iniciando em programação agora então ainda não tenho muita experiência, este foi meu primeiro ingresso em um fórum para obter ajuda em algo e tive uma ótima primeira impressão graças a ti.

Abaixo está o código que eu fiz e vou deixar aqui pra ajudar alguém que possa precisar no futuro, ele tem alguns "por menores" para acertar questões de posicionamento dos itens e também para não haver duplicidades dos valores já somado ou mesmo criar itens duplicados dos que não dever ser somados (por exemplo apenas um item na NF)...

(para que for utilizar este código, antes de tudo é necessário criar o lista1 e lista2 da fazer um sort organizando pela NF - em meu exemplo campo [11])

    for i in range(len(lista1)):
        for j in range(i + 1, len(lista2)):"
            if lista1[11] == lista2[j][11]:
                if lista1[11] == lista2[j-1][11] and lista1[11] != lista2[j-2][11]:
                    valor = lista2[9] +  lista2[j][9]
                else:
                    valor += lista2[j][9]
                if len(listaFinal) != 0 and listaFinal[len(listaFinal)-1][11] == lista1[11]:
                    listaFinal[len(listaFinal)-1][9] = round(valor,2)
                else:
                    valor = lista1[9] + lista2[j][9]
                    listaFinal.append(lista1)
                    listaFinal[len(listaFinal)-1][9] = round(valor)
            else:
                    if  (j + 1 == len(lista2)):
                        listaFinal.append(lista1[j])
                    elif valor != 0:
                        pass
                    else:
                        listaFinal.append(lista1)
                    valor = 0
            break

 

 

Grande abraço.

Sucesso!!!

 

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,7k
×
×
  • Criar Novo...