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']
3 Réponses :
Je pense:
result_list=[]
for i in unique_data:
if coursecount[0] == i[3]:
Result_list.extend(i.append(coursecount[1]))
J'ai essayé cela aussi, mais j'obtiens TypeError: 'int' object is not subscriptable
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
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!
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)