2017-10-18 18 views
0

J'ai donc une liste de valeurs numériques qui sont de type chaîne. Certains des éléments de la liste contiennent plus d'une valeur numérique, par exemple:Transformer la liste de chaînes en entiers, mais la sortie est fractionnement des chiffres au lieu de

AC_temp= ['22', '45, 124, 12', '14', '12, 235']

Je suis en train de transformer chacun de ces éléments en entiers, tout en conservant les sous-listes/tuples, donc Je veux que ça ressemble à:

AC_temp=[22, [45, 124, 12], 14, [12, 235]]

Quand je lance ce qui suit:

 for x in AC_temp: 
      if "," in x: #multiple values 
       val= x.split(",") 
       print(val) 

Je reçois la sortie, je pense:

['187', '22'] 
['754', '17'] 
['417', '7'] 
['819', '13'] 
['606', '1'] 
['123', '513'] 

Mais lorsque je tente de les transformer en ints par les éléments suivants:

 for x in AC_temp: 
      if "," in x: 
       val= x.split(",") 
       for t in val: 
        AC.append(map(int, t)) 
      else: 
       AC.append(map(int, x) 

     #print output# 
     for i in AC: 
      print(i) 

Il imprime les chiffres séparément en tant que tel:

[1, 8, 7] 
[2, 2] 
[7, 5, 4] 
[1, 7] 
[4, 1, 7] 
[7] 
[8, 1, 9] 
[1, 3] 
[6, 0, 6] 
[1] 
[1, 2, 3] 
[5, 1, 3] 

Qu'est-ce que je fais de mal?

+0

Copie possible de [Comment convertir les chaînes en entiers en Python?] (https://stackoverflow.com/questions/642154/how-to-convert-strings-into-integers-in-python) – scharette

Répondre

1

Vous n'avez pas besoin for -loop, parce que map déjà itère sur les éléments: dédoublées

AC = [] 
    for x in AC_temp: 
     if "," in x: 
      val= x.split(",") 
      AC.append(list(map(int, val)) 
     else: 
      AC.append([int(x)]) 

    #print output# 
    for i in AC: 
     print(i) 

ou sous une forme plus compacte:

AC = [list(map(int, x.split(","))) for x in AC_temp] 

    #print output# 
    for i in AC: 
     print(i) 
+1

Notez que cela ne préserve pas les sous-listes - pour ce faire, changez «.extend» en '.append' –

+0

vous avez raison, répondez à jour. – Daniel

+0

@Daniel cela retourne '[[22], [45, 124, 12], [14], [12, 235]]'. Même les éléments individuels sont dans des listes. –

0

Que diriez-vous d'un list-comprehension?

AC_temp= ['22', '45, 124, 12', '14', '12, 235'] 

AC = [int(x) if ',' not in x else list(map(int, x.split(','))) for x in AC_temp] 
print(AC) # [22, [45, 124, 12], 14, [12, 235]] 

Notez que si vous utilisez python2, vous n'avez pas besoin de jeter le map à list; c'est déjà un list.

0

Une façon lisible agréable de le faire est de modifier progressivement la liste en utilisant la compréhension de la liste:

AC_temp= ['22', '45, 124, 12', '14', '12, 235'] 

individual_arrays = [i.split(", ") for i in AC_temp] 
# ...returns [['22'], ['45', '124', '12'], ['14'], ['12', '235']] 

each_list_to_integers = [[int(i) for i in j] for j in individual_arrays] 
# ...returns [[22], [45, 124, 12], [14], [12, 235]] 

ou bien, combinés en une ligne:

numbers_only = [[int(i) for i in j] for j in [i.split(", ") for i in AC_temp]] 

Alors si vous voulez vous pouvez briser les numéros uniques de leurs listes jointes:

no_singles = [i[0] if len(i) == 1 else i for i in each_list_to_integers]