Python - ayuda!! problema de ordenado de matrices

   
Vista:

ayuda!! problema de ordenado de matrices

Publicado por Jhojam David yohanarteaga9@gmail.com (4 intervenciones) el 04/06/2017 16:14:42
hola necesito ayuda con un codigo que no me sale :( intento hacerlo pero nada no puedo alguien que tenga mas conocimientos y desee ayudar a un iniciante en programacion en python se lo agradeceria muchisimo.

este es el problema y estaba intentando resolverlo.
-Mi mayor duda es como puedo ordenar la matriz en la cual estan todas las hectareas pero moviendose junto con los nombres (no se si me entiendan, ejemplo: juan-5, pedro-7,ana-1 supongamos que es una matriz o lista cada una separadas osea: [juan,pedro,ana] [5,7,1] correspondientemente y tengo que ordenarlas seria algo asi: "ana-1,juan-5,pedro-7")
-Otra de mis dudas es como puedo sumar toda una matriz o lista y luego dividirla con cada una de sus integrantes(esto es para que me salga el porcentaje que corresponda a cada agricultor para su bono)

abajo les adjunto mi trabajo .py



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
'''
=================================================================================================================================================
el gobierno peruano desea entregar 10 bonos a agricultores,
solo aceptara terrenos cultivados mayores a 15.000 hectareas de 20 participantes
que cumplan con la condicion.
para la reparticion se tomará como referencia al terreno cultivado más grande.

si se tiene 400millones de soles en bonos para entregar de acuerdo al tamaño del terreno cultivado, el programa debe imprimir:
1-de mayor a menor.
2-el nombre y apeliido de los 10 afortunados.
3-el valor de su bono en soles(2decimales)
4-el porcentaje del bono asignado(1decimal)
=================================================================================================================================================
'''
 
def valnombre(a):   #definimos funcion para validar nombre
    v=0
    if str.isalpha(a)==True: #para comprobar si es letra
        v=1
    else:
        print("solo se aceptan letras")
    return v
 
m=4
 
N=[ ] #creamos una lista vacia
H=[ ]    #creamos una lista vacia
 
for i in range(1,m):
    while True:
        a=str(input("ingrese el nombre {}:".format(i)))
        if valnombre(a)==1:
            N.append(a) #añadiendo a la  lista N
            break
    while True:
        a=str(input("ingrese el apellido {}:".format(i)))
        if valnombre(a)==1:
            N.append(a) #añadiendo a la  lista N
            break
    while True:
        b=input("ingrese la hectarea {}:".format(i))
 
        try:            #para validar las hectareas
            c=float(b)
 
        except:
            print("solo se aceptan numeros")
            continue
        H.append(c) #añadiendo a la  lista H
        break
 
print (N)
ordenar=sorted(H)       #sorted(H) para ordenar de mayor a menor la lista H
print("Orden de las hectareas\n")
print (H)
def porcentaje():
    s=0
    for i in H:
        s=s+i
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de kip

ayuda!! problema de ordenado de matrices

Publicado por kip (232 intervenciones) el 04/06/2017 19:48:35
Hola, lo que te aconsejaria, como te comentaba en el chat, es usar un diccionario para matener una relacion entre el nombre y el valor, de esa forma podrias tener algo asi:

1
{'Juan':14, 'Pedro':25}

Y te sera facil ordenarlo sin perder la relacion, por ejemplo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
datos = {}
 
while True:
    nombre = input('Nombre:')
    edad = int(input('Hectarea:'))
    datos[nombre] = edad
    if len(datos) > 2: break
 
datosOrd = {k: datos[k] for k in sorted(datos, key=datos.get)}
 
print('\nDatos NO ordenados')
for nombre in datos:
    print('Nombre: %s - Hectarea: %d' % (nombre, datos[nombre]))
 
print('\nDatos ordenados')
for nombre in datosOrd:
    print('Nombre: %s - Hectarea: %d' % (nombre, datosOrd[nombre]))

Alli ingresamos un nombre y un valor entero que sera la hectarea a un diccionario y luego mostramos los datos sin ordenar, tal como fueron ingresados y luego ordenados:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Nombre: Juan
Hectarea: 79
Nombre: Luis
Hectarea: 12
Nombre: Pepe
Hectarea: 100
 
Datos NO ordenados
Nombre: Juan - Hectarea: 79
Nombre: Luis - Hectarea: 12
Nombre: Pepe - Hectarea: 100
 
Datos ordenados
Nombre: Luis - Hectarea: 12
Nombre: Juan - Hectarea: 79
Nombre: Pepe - Hectarea: 100

Hay muchas mas formas de ordenar un diccionario, el modulo operator puede ayudar, pero esta es una forma muy intuitiva de hacerlo para que se logre entender como funciona.

1
datosOrd = {k: datos[k] for k in sorted(datos, key=datos.get)}

Es lo que te aconsejo, pero si aun decides mantener listas separadas puedes tambien ordenar las dos listas en base a las hectareas, por ejemplo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
nombres =[]
hectareas = []
 
while True:
    nombres.append(input('Nombre:'))
    hectareas.append(int(input('Hectarea:')))
    if len(nombres) > 2: break
 
hectareasOrd = sorted(hectareas)
nombresOrd = [nombres[hectareas.index(hectareaOrd)] for hectareaOrd in hectareasOrd]
 
print('\nDatos NO ordenados')
for i, nombre in enumerate(nombres):
    print('Nombre: %s - Hectarea %d' % (nombre, hectareas[i]))
 
print('\nDatos ordenados')
for i, nombre in enumerate(nombresOrd):
    print('Nombre: %s - Hectarea %d' % (nombre, hectareasOrd[i]))

En este codigo almacenamos independientemente cada nombre y hectarea en una lista, pero si nos damos cuenta es en cada bucle que hacemos esto, por ende tendremos una relacion en cuanto a las posiciones de estos valores en sus listas, con ese dato es posible ordenar ambas, este es lo que nos muestra el codigo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Nombre: Juan
Hectarea: 78
Nombre: Luis
Hectarea: 55
Nombre: Pepe
Hectarea: 2
 
Datos NO ordenados
Nombre: Juan - Hectarea 78
Nombre: Luis - Hectarea 55
Nombre: Pepe - Hectarea 2
 
Datos ordenados
Nombre: Pepe - Hectarea 2
Nombre: Luis - Hectarea 55
Nombre: Juan - Hectarea 78

Como dije mas arriba, es la relacion de posicion de los valores en sus listas la clave para poder ordenar ambas, primero ordeno la lista de hectareas y luego tomo cada valor ya ordenado y con este la posicion en la lista de hectareas(no ordenada) de aquel valor, esta posicion nos servira para tomar el valor de la lista de nombres y guardar este nombre en una nueva lista, al final obtendremos una lista de nombres ordenados en base al orden de edades:

1
2
hectareasOrd = sorted(hectareas)
nombresOrd = [nombres[hectareas.index(hectareaOrd)] for hectareaOrd in hectareasOrd]

El uso de diccionario lo veo mas ventajoso en cierto aspecto, pero el problema es que cada key del diccionario debe ser unica, es decir no pueden repetirse nombres ya que se sobrescribiran los valores.

Tambien puedes crear una lista bidimensional algo asi:

1
[['Luis', 70], ['Pepe', 15]]

Tendras una mejor relacion de los nombres y hectareas, por ejemplo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
datos =[]
 
while True:
    datos.append([input('Nombre:'), int(input('Hectarea:'))])
    if len(datos) > 2: break
 
datosOrd = sorted(datos, key=lambda dato: dato[1])
 
print('\nDatos NO ordenados')
for dato in datos:
    print('Nombre: %s - Hectarea %d' % (dato[0], dato[1]))
 
print('\nDatos ordenados')
for dato in datosOrd:
    print('Nombre: %s - Hectarea %d' % (dato[0], dato[1]))

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Nombre: Luis
Hectarea: 900
Nombre: Juan
Hectarea: 78
Nombre: Pepe
Hectarea: 45
 
Datos NO ordenados
Nombre: Luis - Hectarea 900
Nombre: Juan - Hectarea 78
Nombre: Pepe - Hectarea 45
 
Datos ordenados
Nombre: Pepe - Hectarea 45
Nombre: Juan - Hectarea 78
Nombre: Luis - Hectarea 900

Creo que existiran mas metodos que pueden servirte pero estos tambien te ayudaran.

Es lo que buscabas ?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar

ayuda!! problema de ordenado de matrices

Publicado por Jhojam David (4 intervenciones) el 04/06/2017 20:23:42
muchas gracias kip creo que veo mas conveniente el de listas ya que puedo hacer operaciones independientes una vez tomado la lista de valores numericos es decir puedo sumar todos los valores de esta y asi poder sacar el bono que dice en el problema sin tomar en cuenta nombres y/o otros datos asi como puede ingresarse un DNI que tambien lo pondria en una lista muy diferente a las dos restantes.

psdt: MUCHAS GRACIAS ENSERIO ESTABA SUFRIENDO POR ESE CODIGO
saludos desde Perú-Arequipa.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

ayuda!! problema de ordenado de matrices

Publicado por Jhojam David (4 intervenciones) el 05/06/2017 15:22:32
por si a alguien le interesa asi termine el codigo :D
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

ayuda!! problema de ordenado de matrices

Publicado por Jhojam David (4 intervenciones) el 05/06/2017 15:21:35
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
import os
import sys
import time
def valnombre(a):   #definimos funcion para validar nombre
    v=0
    if str.isalpha(a)==True: #para comprobar si es letra
        v=1
    else:
        print("solo se aceptan letras")
    return v
def valnum(a):
    v=0
    if str.isnumeric(a)==True:
        v=1
    else:
        print("solo se permite numeros")
    return v
 
def valdni(a):
    v=0
    if valnum(a)==1:
        if len(a)==8:
            v=1
        else:
            print("tiene que ser 8 digitos")
    return v
def valrango(a):
    v=0
    if valnum(a)==1:
        if float(a)>=8:
            v=1
        else:
            print("tiene que ser mayor que 8")
    return v
 
def ingreso():
 
    nombres =[]
    apellidos =[]
    dni =[]
    hectareas =[]
 
    while True:
        while True:
                a=str(input("ingrese el nombre: "))
                if valnombre(a)==1:
                    nombres.append(a) #añadiendo a la  lista nombre
                    break
        while True:
                a=str(input("ingrese el apellido: "))
                if valnombre(a)==1:
                    apellidos.append(a) #añadiendo a la  lista nombre
                    break
        while True:
                a=str(input("ingrese el dni: "))
                if valdni(a)==1:
                    d=int(a)
                    dni.append(d) #añadiendo a la  lista dni
                    break
        while True:
                b=input("ingrese la hectarea :")
                if valrango(b)==1:
                    c=float(b)
                    hectareas.append(c) #añadiendo a la  lista hectareas
                    break
        if len(nombres)>1:
            break
    hectareasOrd = sorted(hectareas,reverse=True)               #para ordenar de mayor a menor
    nombresOrd = [nombres[hectareas.index(hectareaOrd)] for hectareaOrd in hectareasOrd]
    apellidosOrd= [apellidos[hectareas.index(hectareaOrd)] for hectareaOrd in hectareasOrd]
    dniOrd= [dni[hectareas.index(hectareaOrd)] for hectareaOrd in hectareasOrd]
 
    #trabajando con los 10 primeros
 
    mitadhectareas=hectareasOrd[:2]
    mitadnombre=nombresOrd[:2]
    mitadapellido=apellidosOrd[:2]
    mitaddni=dniOrd[:2]
 
    P=[] #lista para el bono recibido
    porcentaje=[]
    s=0
    for i in mitadhectareas:
        s=s+i
    for i in mitadhectareas:
        x=i*(400000/s)
        P.append(x)
    for i in mitadhectareas:
        y=((100*i)/s)
        porcentaje.append(y)
 
    os.system('clear')
    print('\nDatos NO ordenados, ni tomando los primeros 10\n')
    for i, nombre in enumerate(nombres):
        print('Nombres: %s %s DNI:%d - Hectarea %f ' % (nombre, apellidos[i], dni[i], hectareas[i]))
 
 
    print('\nDatos ordenados, tomando los primeros 10 mayores\n')
    for i, nombre in enumerate(mitadnombre):
        print('Nombres: %s %s DNI:%d - Hectarea %f -Bono s/.%f -Porcentaje del bono: %f' % (nombre, mitadapellido[i], mitaddni[i], mitadhectareas[i],P[i],porcentaje[i]))
    salir()
 
def salir():
    print("\n\n¿Desea salir?")
    print("1)si")
    print("2)no")
    y=input("Elija una opcion : ")
    if y=='2' or y.lower()=="no":
        os.system('clear')
        ingreso()
    elif y=='1' or y.lower()=="si":
        os.system('clear')
        seguro()
    else :
        print("Intentelo de nuevo")
        salir()
def seguro():
    print("\n¿Esta realmente seguro de que desea salir?")
    print("1)si")
    print("2)no")
    y=input("Elija una opcion : ")
    if y=='2' or y.lower()=="no":
        os.system('clear')
        ingreso()
    elif y=='1' or y.lower()=="si":
        print("El programa se esta cerrando...")
        time.sleep(2)
        sys.exit(1)
    else :
        print("Intentelo de nuevo")
        salir()
ingreso()
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Revisar política de publicidad