0
votes

Ajouter à la fin de la liste si l'élément correspond à l'élément dans la liste des listes

J'ai une liste de listes dans lesquelles je veux faire correspondre l'élément [3] dans chaque liste imbriquée à l'élément [1] dans un autre ensemble de listes générées à partir d'une boucle for. L'élément [1] doit être ajouté à chaque liste imbriquée de listes s'il y a une correspondance.

[98764, 'Feynman, R', 'SFEN', 'SSW 687', 3]
[98763, 'Newton, I', 'SFEN', 'SSW 689', 1]
[98763, 'Newton, I', 'SFEN', 'SSW 555', 1]

Nombre d'étudiants généré pour chaque cours à partir d'une boucle for :

for i in unique_data:
    if coursecount[0] == [el[3] for el in unique_data]:
        unique_data.append(coursecount[1])

Une bonne approche pourrait-elle consister à générer une liste de listes à partir du décompte des élèves?

Cette approche (où coursecount est chacune des listes générées):

['SSW 555', 1]
['SSW 689', 1]
['SSW 687', 3]

Ne fonctionne pas car [el[3] for el in unique_data] donne l'impression d'une liste de tous les cours, qui bien sûr ne correspondra pas à une seule valeur. Le résultat final souhaité serait quelque chose comme:

unique_data = [[98764, 'Feynman, R', 'SFEN', 'SSW 687'], [98763, 'Newton, I', 'SFEN', 'SSW 689'], [98763, 'Newton, I', 'SFEN', 'SSW 555']


0 commentaires

3 Réponses :


0
votes

Je pense:

result_list=[] 
for i in unique_data:
    if coursecount[0] == i[3]:
        Result_list.extend(i.append(coursecount[1]))
        


1 commentaires

J'ai essayé cela aussi, mais j'obtiens TypeError: 'int' object is not subscriptable



1
votes

coursecount ressemble à une liste de listes. Cette structure de données n'est pas très efficace si vous souhaitez y rechercher des éléments. Vous feriez mieux de le convertir en dictionnaire.

[[98764, 'Feynman, R', 'SFEN', 'SSW 687', 3],
 [98763, 'Newton, I', 'SFEN', 'SSW 689', 1],
 [98763, 'Newton, I', 'SFEN', 'SSW 555', 1]]

Maintenant coursecount_dict est

unique_data = [[98764, 'Feynman, R', 'SFEN', 'SSW 687'], [98763, 'Newton, I', 'SFEN', 'SSW 689'], [98763, 'Newton, I', 'SFEN', 'SSW 555']]

for item in unique_data:
    coursename = item[3]
    students = coursecount_dict.get(coursename, 0) 
    # students becomes coursecount_dict[coursename], 0 if not exists
    item.append(students)

Vous pouvez rechercher des valeurs dans un dictionnaire à l'aide de la clé beaucoup, beaucoup plus rapidement que vous ne pouvez rechercher des éléments dans une liste de listes. Par exemple, pour obtenir la valeur de 'SSW 687' , il vous suffit de faire coursecount_dict['SSW 687'] . Il s'agit d'une opération O (1) en raison du fonctionnement des dictionnaires. Si vous avez utilisé une liste de listes, ce serait une opération O (n) car vous devrez parcourir tous les cours pour trouver celui qui correspond.

Ensuite, vous souhaitez effectuer une boucle sur unique_data , obtenir l'élément correct du dictionnaire et l'ajouter à la liste dans unique_data . Vous pouvez l'ajouter sur place.

{'SSW 555': 1, 'SSW 689': 1, 'SSW 687': 3}

Désormais, unique_data devient:

coursecount = [['SSW 555', 1], ['SSW 689', 1], ['SSW 687', 3]]
coursecount_dict = {a: b for a, b in coursecount}
# Or simply, you could do
# coursecount_dict = dict(coursecount)
# because coursecount is a Nx2 list of key-value pairs


1 commentaires

Cela a fait l'affaire! J'ai eu coursecount défini comme une paire clé: valeur avec une liste de listes pour une raison quelconque, alors je viens de le changer pour un dictionnaire dans ma définition initiale. Merci de votre aide!



0
votes

Cet exemple produit ce que vous vouliez:

listsss = [['SSW 555', 1], ['SSW 689', 1], ['SSW 687', 3]]
unique_data = [[98764, 'Feynman, R', 'SFEN', 'SSW 687'], [98763, 'Newton, I', 'SFEN', 'SSW 689'], [98763, 'Newton, I', 'SFEN', 'SSW 555']]
    
for coursecount in listsss:
    for element in unique_data:
        if coursecount[0] == element[3]:
            element.append(coursecount[1])
print(unique_data)


0 commentaires