1
votes

Convertir la liste des str tuples en liste des int tuples?

J'ai une liste de tuples que je voudrais importer dans un dictionnaire. Ces tuples se composent de deux chaînes. Je voudrais convertir ces tuples en nombres entiers. ie

list(map(int, myList))

La liste résultante devrait être:

resList = [(0,1), (0,2), (0,3)]

J'ai essayé d'utiliser:

myList = ['0,1', '0,2', '0,3']

Mais cela ne semble pas fonctionner.


0 commentaires

5 Réponses :


3
votes

Vous devez également diviser vos chaînes par ','.

>>> from ast import literal_eval                                                                                                  
>>> [literal_eval(x) for x in myList]                                                                                             
[(0, 1), (0, 2), (0, 3)]

Une autre option consiste à utiliser le module csv .

/ p>

>>> list(csv.reader(myList, quoting=csv.QUOTE_NONNUMERIC))                                                                        
[[0.0, 1.0], [0.0, 2.0], [0.0, 3.0]]

Si ce n'est pas très important les éléments internes du résultat sont des tuples et qu'ils sont de type int , on peut simplifier le csv solution à

>>> import csv                                                                                                                    
>>> list(csv.reader(myList))                                                                                                      
[['0', '1'], ['0', '2'], ['0', '3']]
>>> [tuple(map(int, row)) for row in csv.reader(myList)]                                                                          
[(0, 1), (0, 2), (0, 3)]

~ modifier ~

la réponse dethelogicalkoan m'a rappelé ast.literal_eval qui fournit la solution la plus élégante (et la plus sûre) ici.

>>> [tuple(map(int, s.split(','))) for s in myList]                                                                               
[(0, 1), (0, 2), (0, 3)]


1 commentaires

ast.literal_eval est trop puissant pour ce cas d'utilisation. En particulier, il analysera avec plaisir les lignes contenant d'autres structures python valides. Je dirais que c'est légèrement moins sûr que le fractionnement et l'analyse via int .



4
votes

Vous pouvez utiliser la fonction eval pour obtenir les tuples, comme ceci. Fonctionne à la fois en python2 et python3.

>>> myList = ['0,1', '0,2', '0,3']
>>> list(map(eval, myList))
[(0, 1), (0, 2), (0, 3)]


0 commentaires

1
votes

Une solution alternative consiste à utiliser ast.literal_eval (au lieu de eval qui peut être considéré comme dangereux):

>>> my_list = ['0,1', '0,2', '0,3']
>>> result = [ast.literal_eval(x) for x in my_list]
>>> result
[(0, 1), (0, 2), (0, 3)]

Donc, vous pouvez faire:

>>> import ast
>>> ast.literal_eval('0,1')
(0, 1)


0 commentaires

1
votes

str.partition peut être utilisé pour ce faire .

>>> [(int(x), int(y)) for x, _, y in (z.partition(',') for z in myList)]
[(0, 1), (0, 2), (0, 3)]

L'expression du générateur (z.partition (',') pour z dans maListe) produit la sortie de str.partition sur chaque élément de la liste, puis nous appelons int sur les parties dont nous avons besoin.


0 commentaires

0
votes

Ceci est une option différente:

myList = ['0,1', '0,2', '0,3']

def tSet(list): 
    return tuple([int(i) for i in list])

resList  = [tSet(i.split(",")) for i in myList]

print(resList) #Output: [(0, 1), (0, 2), (0, 3)]


0 commentaires