J'ai du mal à comprendre pourquoi ma boucle ne supprime pas les dates invalides d'une liste de tuples de dates au format jj / mm / aaaa. voici ce que j'ai jusqu'à présent:

dates = [('12','10','1987'),('13','09','2010'), ('34','02','2002'), ('02','15','2005'),('37','10','2016'),('39','11','2001')]
print(dates)

for date in dates :
    day = int(date[0])
    month = int(date[1])
    year = int(date[2])

    if day > 31 :
        dates.remove(date)


    if month > 12 :
        dates.remove(date)



print(dates)

Et voici le résultat:

[('12', '10', '1987'), ('13', '09', '2010'), ('34', '02', '2002'), ('02', '15', '2005'), ('37', '10', '2016'), ('39', '11', '2001')]

[('12', '10', '1987'), ('13', '09', '2010'), ('02', '15', '2005'), ('39', '11', '2001')]

Je suis un débutant total et toute aide serait très appréciée.

-1
steb 2 juin 2020 à 00:44

2 réponses

J'aime l'approche de compréhension de @ AnnZen (+1) même si ma tendance serait d'aller plus symbolique au gaspillage de temps et d'espace:

dates = [ \
    ('12', '10', '1987'), \
    ('13', '09', '2010'), \
    ('34', '02', '2002'), \
    ('02', '15', '2005'), \
    ('37', '10', '2016'), \
    ('39', '11', '2001'), \
]

dates = [date for (day, month, _), date in zip(dates, dates) if day < '31' and month < '12']

print(dates)

SORTIE

> python3 test.py
[('12', '10', '1987'), ('13', '09', '2010')]
>

En ce qui concerne @ np8 "Ne modifiez jamais la liste sur laquelle vous bouclez.", C'est un excellent conseil. Cependant, encore une fois, je pourrais perdre de l'espace à faire la copie d'avance pour simplifier mon code:

for date in list(dates):  # iterate over a copy
    day, month, _ = date

    if int(day) > 31 or int(month) > 12:
        dates.remove(date)

Bien qu'au final, le filtrage de @ np8 par datetime semble la solution la plus fiable. (+1)

0
cdlane 2 juin 2020 à 04:41

Vous pouvez facilement accomplir cela avec cette compréhension de liste:

dates = [('12','10','1987'),('13','09','2010'), ('34','02','2002'), ('02','15','2005'),('37','10','2016'),('39','11','2001')]
dates = [date for date in dates if int(date[1]) < 12 and int(date[0]) < 31]
print(dates)

Production:

[('12', '10', '1987'), ('13', '09', '2010')]
1
Ann Zen 1 juin 2020 à 21:51