Python - Comparar elemento en una sola lista

 
Vista:

Comparar elemento en una sola lista

Publicado por MIO (1 intervención) el 28/06/2017 05:53:09
Hola quería saber si hay alguna manera de comparar elementos de una sola lista entre si.
Por ejemplo yo tengo una lista vacía que voy a llenar con tuplas, la tupla es (nombre,edad,materias que cursa la persona).. No se cuantas tuplas contiene hasta que el usuario ingresa la cantidad que desea.

Un ejemplo de la lista:
lista= [ ('Maria', 15, ['Matematica', 'Lengua']), ('Juan', 16, 'Geografia'), ('Marcos', 17, ['Matematica', 'Lengua'])]

Ahora quiero saber, hay personas que tienen la misma edad dentro de esta lista? Si las hay, cursan las mismas materias?

Probe muchas maneras pero esto es a lo que llego siempre, utilizar dos for uno que recorra la lista de (0, len(lista)) y otro de (1,len(lista)), algo asi:

for x in range (len(lista)):
for j in range (1,len(lista)):
if lista[x][1] == lista[j][1]: .....

Esto siempre da error "out of range"

En conclusión, comparar elementos dentro de una misma lista?

(Mis conocimientos son básicos)

Gracias!
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
Val: 1.120
Bronce
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Comparar elemento en una sola lista

Publicado por kip (257 intervenciones) el 29/06/2017 02:37:40
Hola, es un tanto tedioso trabajar sobre una misma lista, he hecho algo, hago dos procesos por cada cosa es decir un proceso para obtener los de la misma edad y en base a este dato obtener las materias en común, he creado mi propia lista basandome en la tuya pero que contiene estudiantes con edades iguales y materias en común.

La lista es esta:

1
2
3
4
5
6
7
lista= [
    ('Maria', 15, ['Matematica', 'Lengua']),
    ('Juan', 15, 'Lengua'),
    ('Marcos', 17, ['Matematica', 'Lengua']),
    ('Luis', 17, ['Literatura', 'Ingles']),
    ('Miguel', 15, ['Matematica', 'Lengua'])
]

Aqui el código:

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
from collections import Counter
 
lista= [
    ('Maria', 15, ['Matematica', 'Lengua']),
    ('Juan', 15, 'Lengua'),
    ('Marcos', 17, ['Matematica', 'Lengua']),
    ('Luis', 17, ['Literatura', 'Ingles']),
    ('Miguel', 15, ['Matematica', 'Lengua'])
]
 
datos_misma_edad = {}
 
'''
Buscamos y obtenemos los estudiantes con la misma edad
'''
for num, estudiante in enumerate(lista):
    for estudiante2 in lista[num + 1:]:
        if estudiante[1] == estudiante2[1]:
            if estudiante[1] in datos_misma_edad:
                nombres = list(set(datos_misma_edad[estudiante[1]]['Nombres'] + [estudiante2[0]]))
                datos_misma_edad[estudiante[1]]['Nombres'] = nombres
            else:
                datos_misma_edad.update({
                    estudiante[1]: {
                        'Nombres': [estudiante[0], estudiante2[0]],
                    }
                })
 
'''
Buscamos y obtenemos las materias en comun entre los estudiantes de igual edad
'''
for edad in datos_misma_edad:
    materias = []
    for estudiante in lista:
        if estudiante[1] == edad:
            materias += estudiante[2] if isinstance(estudiante[2], list) else [estudiante[2]]
    materias = {
        'Materias': [materia for materia, cant in Counter(materias).items() if cant == len(datos_misma_edad[edad]['Nombres'])]
    }
    if not materias['Materias']: materias['Materias'] = ['Ninguna']
    datos_misma_edad[edad].update(materias)
 
'''
Mostramos los datos que obtuvimos
'''
for edad, datos in datos_misma_edad.items():
    print('Estudiantes con edad de %d años:' % edad)
    print('\tNombres: %s' % ', '.join(datos['Nombres']))
    print('\tMaterias en común: %s' % ', '.join(datos['Materias']))

Como te dije, es algo tedioso, trata de analizarlo no tiene mucha complejidad pero si da algo de confusión.

Lo que mostrara el código anterior sera:
1
2
3
4
5
6
Estudiantes con edad de 15 años:
	Nombres: Juan, Miguel, Maria
	Materias en común: Lengua
Estudiantes con edad de 17 años:
	Nombres: Marcos, Luis
	Materias en común: Ninguna

Nos avisas que tal te fue.
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