1
votes

Comment convertir des chaînes numériques dans une liste mixte de liste en int (Python)

comment puis-je convertir toutes les chaînes numériques, dans une liste de liste contenant à la fois des chaînes alphabétiques et numériques, en un entier?

Ma sortie:

def get_csv_as_table(a, b):
s = False
import csv

with open(a) as csv_file:
    file_reader = csv.reader(csv_file, delimiter=b)
    member = list(file_reader) 

    print(member)

print ("Enter filename: ")
a = input()
print ("Enter the delimiter: ")
b = input()
get_csv_as_table(a, b)

Sortie prévue:

[[69, ' Test', 'Results'], ['A', 'B', 'C'], ['D', 420, 'F']]

Notez que mon code lit un fichier CSV. Merci tout le monde

[['69', ' Test', 'Results'], ['A', 'B', 'C'], ['D', '420', 'F']]


3 commentaires

Que diriez-vous de str.isdigit() ?


J'ai essayé de l'utiliser oui, mais j'ai du mal à fonctionner car c'est une liste de listes :(


[[int(s) if s.isdigit() else s for s in lst] for lst in lists] .


3 Réponses :


1
votes

Vous devez combiner 2 niveaux de compréhension de liste et utiliser str.isdigit()

values = [
    [int(val) if val.isdigit() else val for val in row]
    for row in values
]


0 commentaires

1
votes

Essayez avec la compréhension de liste à 2 niveaux et la .isdigit() puissance int() + .isdigit() dans la compréhension de liste ;-)

[[69.0, ' Test', 'Results'], ['A', 'B', 'C'], ['D', 420.0, 'F']]

Production:

l=[['69', ' Test', 'Results'], ['A', 'B', 'C'], ['D', '420', 'F']]
l=[[float(y) if y.replace('.','').isdigit() else y for y in x] for x in l]
print(l)

.isdigit() ne fonctionne que sur la représentation sous forme de chaîne d'entiers purs, si vous avez également des flottants, remplacez '.' à rien ;-)

[[69, ' Test', 'Results'], ['A', 'B', 'C'], ['D', 420, 'F']]

Production:

l=[['69', ' Test', 'Results'], ['A', 'B', 'C'], ['D', '420', 'F']]
l=[[int(y) if y.isdigit() else y for y in x] for x in l]
print(l)


2 commentaires

Merci beaucoup mes gars :) Vous êtes une légende


Veuillez cliquer sur la grande coche pour accepter merci



1
votes

Vous pouvez utiliser la compréhension de liste pour y parvenir. Le seul inconvénient mineur est que vous allez créer une nouvelle liste pour cela au lieu de modifier la liste existante.

my_list = [['69', 'Test', 'Results'], ['A', 'B', 'C'], ['D', '420', 'F']]

for i in range(len(my_list)):
    for j in range(len(my_list[i])):
        if my_list[i][j].isdigit():
            my_list[i][j] = int(my_list[i][j])

Si vous souhaitez modifier la liste sur place , vous pouvez utiliser la boucle for traditionnelle. Le code suivant modifiera la liste existante sans créer de nouvelle liste. Cela pourrait s'avérer utile au cas où vous auriez une longue liste.

my_list = [['69', 'Test', 'Results'], ['A', 'B', 'C'], ['D', '420', 'F']]

filtered_list = [
    [int(item) if item.isdigit() else item for item in sub_list]
    for sub_list in my_list
]

str.isdigit() vérifie si une chaîne donnée est un nombre ou non. Une note importante à garder à l'esprit est que cela ne fonctionne pas pour les nombres à virgule flottante, juste pour les entiers. Une fois la condition réussie, l'élément est converti en entier.


2 commentaires

Oui, très gentil. Merci beaucoup mon mec! cela a beaucoup aidé


Si cette réponse vous semble utile, vous pouvez l'accepter et la voter :)