Convertir números a los grados en python lista

Tengo una lista que tiene el número de marcas que los estudiantes tienen.

s = [50,62,15,76,57,97,82,99,45,23]

Quiero a estudiantes de grado de acuerdo a las marcas:

<40 - Fail
>50 - A Grade
>75 - A++ Grade

Puedo hacer esto con la iteración de bucles o me pueden encontrar en cada lista utilizando lambda.
por ejemplo :

>>> filter(lambda x:x>=50, s)
[50, 62, 76, 57, 97, 82, 99]

Pero, en el filtro, puedo trabajar con una única función en un tiempo (por ejemplo : marcas de más de 50). Hay manera en la que puede utilizar el filtro y lambda y obtener resultado deseado en una línea? Esperando la salida de las marcas con el grado. (ex : 50 – A, 62 – A, 76 – A++ …)

InformationsquelleAutor sam | 2012-03-15

4 Kommentare

  1. 21

    Definir una función que toma una marca y devuelve un legible por humanos de la representación, puede utilizar larsmans la expresión o esta otra:

    def grade(i):
        if i<40: return "Fail"
        if i>75: return "A++"
        if i>50: return "A"

    Uso de la cadena.formato de formato de cada entrada y mapa para iterar sobre todos ellos:

    li = map(lambda x: "{0} - {1}".format(x, grade(x)), s)

    La lista resultante, que ahora contiene cadenas de caracteres en el formato deseado.

    for i in li: print i
    
    # output
    
    50 - None
    62 - A
    15 - Fail
    76 - A++
    57 - A
    97 - A++
    82 - A++
    99 - A++
    45 - None
    23 - Fail
  2. 15

    Olvidar lambda, olvidar filter; la siguiente se hace la clasificación en una expresión, asumiendo que hay un grado B de entre Una y «fail».

    ["fail" if g < 40 else "B" if g < 60 else "A" if g < 75 else "A++" for g in s]

    Puede zip el resultado de este con s para conseguir marcas y calidades en una lista.

    • O usted puede utilizar el mapa, map(lambda x: (x, 'F' if x<40 else 'A++' if x>70 else 'A'), s). O simplemente perder el (x, (y ) de curso) si desea que sólo los grados. La lista se ordena de modo que se puede coincidir más adelante.
    • Que la comprensión es en 78 caracteres. Usted obtener gratis los saltos de línea en ellos. Sé que va en contra de Google Python reglas de estilo, pero prefiero romper a través de varias líneas, posiblemente al final de cada else.
    • No soy consciente de Google reglas de estilo, pero en un práctico programa que sería, de hecho, poner algunos puedes incluir varias líneas en. stackoverflow.com/a/5809080/166749
  3. 2
    s = [50,62,15,76,57,97,82,99,45,23]
    x = dict([(a, 'A++' if a>75 else 'A' if a>55 else 'F') for a in s])
    
    print x
    
    {97: 'A++', 45: 'F', 99: 'A++', 76: 'A++', 82: 'A++', 15: 'F', 50: 'F', 23: 'F', 57: 'A', 62: 'A'}

    Uso x.items() para hacer de filtro, por ejemplo

    filter(lambda x: x[1] == 'A', x.items())

    el resultado es

    [(57, 'A'), (62, 'A')]
    • 2 ámbitos en una línea donde el x nombre es algo diferente. No muy diferente de la otra respuesta, así que si usted tenía el privilegio de editar, una edición que podría haber sido un mejor ajuste de una respuesta.
  4. 1

    Usted puede escribir su propio filtro como función:

    def filter_n(n, f, lst):
        result = tuple([[] for i in range(n)])
        for elem in lst:
            result[f(elem)].append(elem)
        return result

    La respuesta es la siguiente:

    grades = filter_n(3, lambda x: (x < 40) * 0 +
                                   (60 < x <= 75) * 1 +
                                   (75 < x) * 2, s)

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea