2 votes

Comment vérifier la présence de valeurs numériques dans une liste de listes et renvoyer plusieurs listes ?

J'ai une liste de listes comme indiqué ci-dessous, mon but est d'obtenir les valeurs numériques à partir de cette liste. Mais le résultat doit être dans un format similaire à celui de la liste d'origine. Par exemple, ma liste ressemble à ceci :

a_list = [['49', 'XT', '19.0', '93'],
 ['YTX', '124.0', '167 ', '77.0'],
 ['4 ', 'Y', '128,', '125,'],
 ['142.0', '120', '141.0'],
 ['12 ', '51.0'],
 ['0,', ' 82', '156'],
 ['82', '102.0'],
 ['94', 'YYZ', '178.0', '72'],
 ['120', 'YXT', '142', ' 134'],
 ['45,', '46', '79.0']]

Le résultat que je souhaite obtenir est le suivant

b_list = [['49', '19.0', '93'],
 ['124.0', '167 ', '77.0'],
 ['4 ', '128,', '125,'],
 ['142.0', '120', '141.0'],
 ['12 ', '51.0'],
 ['0,', ' 82', '156'],
 ['82', '102.0'],
 ['94', '178.0', '72'],
 ['120', '142', ' 134'],
 ['45,', '46', '79.0']]

J'ai écrit le code suivant mais il saute beaucoup de nombres et le format n'est pas le même.

final=[]
for i in a_list:
    for num in i:
        if num.isdigit():
            final.append(num)

Qu'est-ce que je fais de travers ? Et comment faire pour utiliser la compréhension de liste ?

2voto

Sadra Naddaf Points 337

Une solution simple de type "regex" :

import re
isnum = re.compile(r'\d+(\.\d+)?$')

final=[]
for i in a_list:
    tmp =[]
    for num in i:
        num = num.strip().replace(",","")
        if isnum.match(num):
            tmp.append(num)
    final.append(tmp)

0voto

EvilReboot Points 43

Essayez ceci :

final=[]
for i in a_list:
    for num in i:
        tmp=[]
        if num.isdigit():
            tmp.append(num)
    final.append(tmp)

0voto

mwo Points 225

Votre liste de saisie contient parfois des caractères qui font échouer l'analyse de la is.decimal vérifier. Définissez une méthode de filtrage et passez-la à la fonction filter builtin.

def _method(x):
    y = x.strip().replace('.', '').replace(',', '')
    return y.isdecimal()

result = [list(filter(_method, x)) for x in a_list]

Il existe un petit problème lorsqu'il s'agit de str.isidigit par exemple, elle acceptera des caractères comme "³", qui ne peuvent pas être transmis comme index à des objets indexables. str.isdecimal est plus stricte et, pour autant que je sache, tout ce qui transite par la str.isdecimal peut être utilisé comme index :

>>> a = '³'
>>> a.isdigit()
True
>>> a.isdecimal()
False

0voto

PandasasPD Points 130

Voici une solution que j'ai trouvée :

b_list = []
for i in a_list:
    new_list = []
    for j in i:
        if j.replace(".", "", 1).replace(" ", "", 1).replace(",", "", 1).isdigit():
            new_list.append(j)
    b_list.append(new_list)
b_list

La sortie est identique à la sortie souhaitée :

[['49', '19.0', '93'],
 ['124.0', '167 ', '77.0'],
 ['4 ', '128,', '125,'],
 ['142.0', '120', '141.0'],
 ['12 ', '51.0'],
 ['0,', ' 82', '156'],
 ['82', '102.0'],
 ['94', '178.0', '72'],
 ['120', '142', ' 134'],
 ['45,', '46', '79.0']]

0voto

marinovik Points 1

Il s'agit d'un fil de discussion assez ancien, mais je me suis trouvé dans la même situation et je voudrais laisser ici la solution que j'ai mise en œuvre.

Compte tenu de la sortie souhaitée, il suffit d'utiliser la fonction regex search() et trouver l'élément qui contient un chiffre re.compile('\d') . Vous éviterez ainsi les problèmes liés aux virgules de dernier indice et aux espaces blancs : Ces éléments ne seront pas considérés comme des chiffres lors de l'utilisation de .isdigit()

Il convient de noter que si vous avez des éléments alphanumériques dans vos listes, cette solution n'est pas appropriée. Cependant, telle que vous la proposez, elle répond parfaitement à vos besoins :

Le code ressemblerait à ceci :

import re

output = []
for list in a_list:
    temp=[]
    for x in list:
        if re.compile('\d').search(x):
            temp.append(x)
    output.append(temp)

En développant davantage la réponse fournie jusqu'à présent. Nous pouvons utiliser les compréhensions de listes pour obtenir un code plus concis et plus ordonné. Peut-être au détriment de la lisibilité :

import re

[[x for x in a_list[i] if re.compile('\d').search(x)] for i in range(len(a_list))]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X