web-dev-qa-db-fra.com

extraire/retirer des éléments d'un tuple de python

Je ne suis pas sûr de pouvoir me clarifier mais j'essaierai.

J'ai un tuple en python que je passe comme suit (voir le code ci-dessous). En le parcourant, je maintiens un compteur (appelons-le "n") et des éléments "pop" qui remplissent certaines conditions.

Maintenant, bien sûr, une fois le premier élément affiché, la numérotation ne va pas, comment puis-je faire ce que je veux faire avec plus d'élégance tout en supprimant certaines entrées d'un Tuple à la volée?

for x in tupleX:
  n=0
  if (condition):
     tupleX.pop(n)
  n=n+1
14
Steve Grafton

ok je me suis débrouillé pour le faire.

Je stocke la valeur "n" dans la boucle for lorsque la condition est satisfaite dans une liste (appelons-la delList), puis procédez comme suit:

    for ii in sorted(delList, reverse=True):
    tupleX.pop(ii)

Toutes les autres suggestions sont également les bienvenues.

3
Steve Grafton

Comme DSM le mentionne, Tuple est immuable, mais même pour les listes, une solution plus élégante consiste à utiliser filter:

tupleX = filter(str.isdigit, tupleX)

ou, si condition n'est pas une fonction, utilisez une compréhension:

tupleX = [x for x in tupleX if x > 5]

si vous avez vraiment besoin que tupleX soit un tuple, utilisez une expression de générateur et transmettez-la à Tuple:

tupleX = Tuple(x for x in tupleX if condition)
40

Peut-être que vous voulez des dictionnaires?

d = dict( (i,value) for i,value in enumerate(tple))
while d:
    bla bla bla
    del b[x]
3
tk.

Un tuple est déclaré immuable.

Et vous n'allez pas faire apparaître un élément à l'intérieur de l'itération, cela provoque une erreur, car il modifie la longueur de la liste obj .

tupleX = Tuple( [ e for e in list( tupleX ) if not condition( e ) ] )

Cela permet de conserver les éléments qui ne correspondent pas à la condition plutôt que de les supprimer de la liste/du tuple.

Mais si vous avez l’intention de le faire de la même manière que vous le souhaitez, vous devez faire votre liste à l’avance par qh comme listX = list( tupleX ). vous feriez mieux d’ajouter l’index des matériaux non désirés à l’intérieur de l’itération dans une liste (non désirée_list), et d’itérer les éléments non désirés et ajoutés à la liste originale. puis rendez-vous à Tuple comme Tuple( listX )

2
Sphynx-HenryAY

Oui, nous pouvons le faire… .. D'abord, convertissez le Tuple en une liste, puis supprimez l'élément de la liste après l'avoir reconverti en Tuple.

Démo:

my_Tuple = (10, 20, 30, 40, 50)

# converting the Tuple to the list
my_list = list(my_Tuple)
print my_list  # output: [10, 20, 30, 40, 50]

# Here i wanna delete second element "20"
my_list.pop(1) # output: [10, 30, 40, 50]
# As you aware that pop(1) indicates second position

# Here i wanna remove the element "50"
my_list.remove(50) # output: [10, 30, 40]

# again converting the my_list back to my_Tuple
my_Tuple = Tuple(my_list)


print my_Tuple # output: (10, 30, 40)

Merci

2
Abdulvakaf K

Il existe une solution simple mais pratique.

Comme le dit DSM, les n-uplets sont immuables, mais nous savons que les listes sont mutables ..__ Donc, si vous changez un tuple en liste, il sera mutable. Ensuite, vous pouvez supprimer les éléments par la condition, puis après avoir changé le type à nouveau un Tuple. C'est tout.

Veuillez regarder les codes ci-dessous:

tuplex = list(tuplex)
for x in tuplex:
  if (condition):
     tuplex.pop(tuplex.index(x))
tuplex = Tuple(tuplex)
print(tuplex)

Par exemple, la procédure suivante supprimera tous les nombres pairs d'un tuple donné.

tuplex = (1, 2, 3, 4, 5, 6, 7, 8, 9)
tuplex = list(tuplex)
for x in tuplex:
  if (x % 2 == 0):
     tuplex.pop(tuplex.index(x))
tuplex = Tuple(tuplex)
print(tuplex)

si vous testez le type du dernier tuplex, vous constaterez qu'il s'agit d'un tuple.

Enfin, si vous souhaitez définir un compteur d’index comme vous l’avez fait (c’est-à-dire n), vous devez l’initialiser avant la boucle et non dans la boucle.

1
Reza K Ghazi