Cuando ejecuto este código, se agrega a la lista, por lo que no puedo encontrar la mediana. ¿Cómo puedo hacer que los valores vacíos no se agreguen a la lista?

import statistics
import time
amount=int(input('How many marks are you going to 
input? (most 10) '))
while amount>10:
    print('No')
    time.sleep(1)
else:
    print(amount)
    input_string=input('Enter marks of students 
separated by a space:   ')
    print('\n')
    user_list = input_string.split()
    print('list: ', user_list)
    user_list=map(int, user_list)
    print('Mean = ', sum(user_list)/amount)
    sorted_string=sorted(input_string)
    print(sorted_string)
    new=(amount+1)//2
    print(new)
    median=sorted_string[new]
    print(median)
-2
Banana 24 nov. 2021 a las 13:04
sorted no cambia la lista de ninguna manera. Devuelve una nueva lista
 – 
DeepSpace
24 nov. 2021 a las 13:07
Sin embargo, no entiendo cómo agrega espacios en blanco a la lista. Cuando lo ejecuto, dice ['', '', '1', '3', '4'] donde la cantidad es 3 y input_string es 4 3 1
 – 
Banana
24 nov. 2021 a las 13:09
sorted_string=sorted(input_string): estás ordenando la cadena. No es una lista.
 – 
user2357112 supports Monica
24 nov. 2021 a las 13:11
Además, user_list=map(int, user_list) crea un iterador no reutilizable, no una lista.
 – 
user2357112 supports Monica
24 nov. 2021 a las 13:11
Ohh veo muchas gracias.
 – 
Banana
24 nov. 2021 a las 13:13

1 respuesta

La mejor respuesta

Primer problema

Estás iterando a través de un mapa más de una vez, lo que te deja con el error de ordenar una colección vacía. (Le sugiero que lea más sobre esto: map() devuelve un iterador)

Para demostrar el problema:

my_map = map(int, ['1', '2', '3'])

print('first run')
for i in my_map:
    print(i)

print('second run')
for i in my_map:
    print(i)

Salida:

first run
1
2
3
second run

Segundo problema

¿Estás pasando input_string a sorted() en lugar de user_list, que es lo que supongo que quieres?

Ejemplo

Arreglar (1) y (2) dará como resultado el resultado esperado:

import statistics
import time
amount=int(input('How many marks are you going to input? (most 10) '))
while amount>10:
    print('No')
    time.sleep(1)
else:
    print(amount)
    input_string=input('Enter marks of students separated by a space:   ')
    print('\n')
    user_list = input_string.split(' ')
    print('list: ', user_list)
    user_list=list(map(int, user_list))
    print('Mean = ', sum(user_list)/amount)
    sorted_string=sorted(user_list)
    print(sorted_string)
    new=(amount+1)//2
    print(new)
    median=sorted_string[new]
    print(median)`

Diálogo:

How many marks are you going to input? (most 10) 2
2
Enter marks of students separated by a space:   100 95


list:  ['100', '95']
Mean =  97.5
[95, 100]
1
100

Notas al margen

Fuera del contexto de su pregunta, considere:

  1. Tomar la cantidad de la lista dada, en lugar de solicitar una cantidad explícitamente
  2. Si la cantidad dada es >10, entonces hay un ciclo infinito que dice 'No'. Solo asegurándome de que esto sea intencional.
1
Ori 24 nov. 2021 a las 13:22
Muchas gracias :)
 – 
Banana
24 nov. 2021 a las 13:21
Marque como respuesta si es así :)
 – 
Ori
24 nov. 2021 a las 13:26
No tengo idea de cómo hacer eso, también el bucle es intencional, sé que puedo usar si, pero solo prefiero un bucle 'No'
 – 
Banana
24 nov. 2021 a las 13:28
1
Oh creo que lo marqué como una respuesta ahora
 – 
Banana
24 nov. 2021 a las 13:30