6
votes

Comment supprimer toutes les chaînes d'une liste de tuples python

J'essaie de supprimer toutes les chaînes d'une liste de tuples

[(100), (80), (20), (40), (40)]

J'ai commencé à essayer de trouver une solution:

output = [i for i in ListTuples if i[0] == str]

print(output)

Mais je n'arrive pas à comprendre comment j'obtiendrais une sortie comme:

ListTuples = [(100, 'AAA'), (80, 'BBB'), (20, 'CCC'), (40, 'DDD'), (40, 'EEE')]

Le format est toujours ( int , str ).


3 commentaires

Savez-vous que vous aurez toujours des éléments de la forme [(, ), ...] ?


Si le format est toujours ( int , str ), la solution suivante pourrait être simple: output = [(i [0],) for i in ListTuples]


@MarkNijboer Oui, c'est aussi parfait


5 Réponses :


9
votes

Utilisez une compréhension de tuple imbriquée et isinstance :

[(100,), (80,), (20,), (40,), (40,)]

Output:

output = [tuple(j for j in i if not isinstance(j, str)) for i in ListTuples]

Notez qu'il y a des virgules de fin dans les tuples pour les distinguer de par exemple (100) qui est identique à 100.


7 commentaires

Cette réponse ne correspond pas à la sortie souhaitée par OP!


@RoadRunner, Pas vrai, [(100), (80), (20), (40), (40)] est un Python valide, c'est une liste d'entiers!


Merci, cela a parfaitement fonctionné! Je dois juste changer l'isinstance (j, str) en isinstance (j, int) pour obtenir les valeurs entières que je recherche. J'accepterai cette réponse


Avoir des crochets n'a de sens que s'il s'agit d'un tuple. Sinon, il devrait s'agir simplement d'une liste d'entiers. Les tuples IMO ont plus de sens, car chaque tuple d'origine pourrait peut-être contenir plus d'entiers


Je pense que cela correspond à la sortie souhaitée de OP, ou plutôt à ce que OP (probablement) avait l'intention de montrer, pas à la manière dont cela est interprété par Python.


@jpp c'est vrai mais il n'aurait pas été imprimé avec les parenthèses.


@ a.rowland Si vous voulez "supprimer toutes les chaînes", alors vous devez utiliser pas isinstance (j, str) , sinon ce serait "garder tous les entiers", ce qui n'est pas strictement le même. (Dans votre exemple, les deux seraient cependant équivalents.)



2
votes

Puisque l'extraction du premier élément de chaque tuple est suffisante, vous pouvez décompresser et utiliser une compréhension de liste. Pour une liste de tuples:

from operator import itemgetter
res = list(map(itemgetter(0), ListTuples))   # [100, 80, 20, 40, 40]

Si vous n'avez besoin que d'une liste d'entiers:

res = [value for value, _ in ListTuples]     # [100, 80, 20, 40, 40]

Pour une alternative fonctionnelle à ce dernier, vous peut utiliser operator.itemgetter :

res = [(value,) for value, _ in ListTuples]  # [(100,), (80,), (20,), (40,), (40,)]


0 commentaires


0
votes

Essayez ceci

ListTuples = [(100, 'AAA'), (80, 'BBB'), (20, 'CCC'), (40, 'DDD'), (40, 'EEE')]

ListInt = []
ListStr = []

for item in ListTuples:
    strAux = ''
    intAux = ''
    for i in range(0, len(item)):

        if(isinstance(item[i], str)):
            strAux+=item[i] 
        else:
            intAux+=str(item[i])


    ListStr.append(strAux)
    ListInt.append(intAux)


print(ListStr)

'''TO CONVERT THE STR LIST TO AN INT LIST'''
output= list(map(int, ListInt)) 
print(output)

Le résultat est [100, 80, 20, 40, 40]


3 commentaires

A quoi servent ces accumulateurs "aux"? Pourquoi ne pas directement appen dans le if / else ? Cela échouera pour [(1, "foo", 3)] ou tout autre tuple qui a plus d'un de chaque type, et dans tous les autres cas, ces variables "aux" n'ont aucune utilité, non plus .


Si vous ajoutez dans if / else , vous récupérez 'A', 'A', 'A', 'B' 'B' et ainsi de suite, car c'est à l'intérieur de la boucle for . Si vous essayez [(1, "foo", 3)] , il renverra 13 et foo


Non, ce n'est pas le cas, car vous n'itérez pas les caractères dans la chaîne, mais uniquement les éléments du tuple. Et, oui, il retournera cela , et je ne pense pas que ce soit ce que OP voulait.



0
votes

Nous vérifions si une valeur particulière est une chaîne ou non en utilisant type(value).

output = [tuple([j for j in i if type(j)!=str]) for i in ListTuples]
print(output)
    [(100,), (80,), (20,), (40,), (40,)]


0 commentaires