2
votes

Exclure un élément d'une liste

Est-il possible d'utiliser slice mais sur un élément spécifique d'une liste? Par exemple a = [1,2,3,4,5,6,7,8,9] Je veux faire une boucle for qui imprime toute la liste sauf le deuxième élément.

Je veux faire quelque chose comme ça:

for i in a[something_slice]: 
    print(i)

Est-ce possible?


3 commentaires

Non, les tranches ne fonctionnent pas comme ça, bien qu'il soit assez facile d'imprimer tout sauf le deuxième élément. C'est l'un des rares domaines où R est plus flexible que Python.


Également possible dupe sur un autre compte .


@ Aplet123 On dirait un devoir où OP n'était pas satisfait de la première réponse. D'un autre côté, il peut s'agir de deux élèves de la même classe.


3 Réponses :


0
votes

vous pouvez le faire sans découpage, en utilisant enumerate ()

index_to_skip=1
for idx,item in enumerate(a):
    if idx!=index_to_skip:
        print(item)


1 commentaires

Le problème est que ma liste contient les attributs d'une classe. Votre méthode fonctionne, mais ensuite je veux ajouter des conditions afin qu'elle puisse imprimer ce dont j'ai besoin et prendre en compte le fait que j'ai sauté un élément



0
votes

Si vous souhaitez réellement découper la liste, vous pouvez utiliser 2 tranches pour la découper:

for i, v in enumerate(a):
    if i == 1:
        continue
    print(v)

Si vous souhaitez simplement le parcourir, vous pouvez également ignorer lorsque l'index atteint la valeur que vous souhaitez ignorer:

def exclude(lst, i):
    return lst[:i] + lst[i + 1:]

exclude([1, 2, 3, 4, 5], 1) # [1, 3, 4, 5]


0 commentaires

1
votes

Pour exclure un seul élément, l'approche à 2 tranches lst[:i] + lst[i + 1:] proposée par @ Applet123 est probablement la plus rapide (Ou peut-être une excluded = lst.pop(1) pour extraire l'élément exclu et for x in lst: print(x) pour imprimer tous les autres; puis lst.insert(1,excluded) pour remettre l'élément exclu dans la liste. Voir la documentation sur les structures de données pour plus de détails).

Si vous souhaitez simplement filtrer certains index, au lieu d'une boucle for, je vous recommande d'utiliser une approche plus pythonique (et intuitive) basée sur la compréhension de la liste et l' énumération :

for x in map(lambda x: print(x[1]),filter(lambda x: x[0] not in excludedIndices,enumerate(myList))): pass

Consultez également l'utilisation en python des fonctions intégrées de filtrage et de carte , qui peuvent être excessives à cette fin, mais offrent toujours une solution générale et plus puissante pour ce type de traitement:

# filters an enumerated element 
def myFilter(element): 
  return element[0] not in excludedIndices

# maps an enumerated element to a function 
def myMap(element): 
  print(element[1])
  
# runs myMap function for each enumerated element on the list filtered by myFilter
for x in map(myMap,filter(myFilter,enumerate(myList))): pass

Que vous pouvez également transformer en une seule ligne en utilisant des expressions lambda :

myList = [1,2,3,4,5,6,7,8,9]
excludedIndices = [1]
myFilteredList = [x for i, x in enumerate(myList) if i not in excludedIndices]
print (myFilteredList)

# output:
# [1,3,4,5,6,7,8,9]

# or, to actually print each element individually:
for x in myFilteredList:
  print (x)

# which can also work as a 2-liner with inline filtering:
for i, x in enumerate(myList):
  if i not in excludedIndices: print(x)


0 commentaires