Estou trabalhando em uma tarefa em Python, na qual só consigo fatiar usando o :
método slice (por exemplo, group= strg [:index]
). Por algum motivo, o método slice se recusa a reconhecer qualquer coisa com mais de 2 dígitos quando se trata de números. Palavras funcionam bem, mas dígitos estão sendo cortados.
Aqui está meu código:
import sys
# set up for for loop
length = len(sys.argv)
for i in range(1, length):
strg = sys.argv[i]
#finds name
index = strg.find(':')
name = strg[:index]
strg = strg[index+1:]
index = strg.find(',')
total = 0
count = 0
while (index != -1):
group = strg[:index]
try:
num = int(group)
except:
break
else:
print(num)
total = total+num
count = count+1
strg = strg[index+1:]
print(count)
avg = total/count
print(name+", average:", avg)
Entrada:Neda:90,80,70,90,50 John:80,100,30 Mary:20,100,90,80
Minha saída:
90
80
70
90
50
5
Neda, average: 76.0
80
10
2
John, average: 45.0
20
10
2
Mary, average: 15.0
Saída pretendida:
90
80
70
90
50
5
Neda, average: 76.0
80
100
30
3
John, average: 70.0
20
100
90
80
4
Mary, average: 72.5
Você só define
index = strg.find(',')
uma vez, antes do loop. Ele é definido como 2 porque o primeiro número tem apenas 2 dígitos. Quando você encontrar um número com 3 dígitos, ainda usará apenas os 2 primeiros. Você precisa procurar a próxima vírgula após cada número que usar, ou seja, no seuelse
ramo dotry
.Então você pulará o último número porque não há mais vírgula. Para contornar isso, ajuste o
else
ramo para verificar-1
e, se for o caso, pegue o restante da string.Provavelmente existem maneiras mais elegantes de fazer isso, mas pelo menos isso lhe dará os resultados esperados.
Uma solução simples seria mover
no loop interno e testar seu resultado para determinar como extrair o próximo número:
Se você for usar fatiamento (que não é a melhor solução na minha opinião), você deve pelo menos incluir algumas verificações de integridade, ou seja, que os argumentos da linha de comando sejam construídos corretamente.
Neste exemplo, erros podem ser observados com o efeito de que um parâmetro malformado será ignorado e continuará a processar todos os outros parâmetros:
A divisão seria uma abordagem mais simples e concisa: