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.
5 Réponses :
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)]
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
.
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)]
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)
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.
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)]