J'ai une sorte de blocage mental ou quelque chose que je pense. J'ai une liste de dates et d'heures qui ont été extraites d'éléments de liste plus grands à l'aide d'expressions régulières -

dates = [['2015-2016'], ['24/08/15'], ['0900-1045'], ['1045-1100'], ['1200-1300'], ['1300-1430'], ['1430-1450'], ['1450-1550'], ['31/08/15'], ['0900-1030'], ['1200-1300'], ['1300-1600'], ['07/09/15', '18/09/15'], ['21/09/15'], ['0900-1000'], ['1100-1200'], ['1200-1300'], ['1400-1530']]

Je ne sais pas pourquoi cela a créé une liste de listes d'articles uniques, mais c'est le cas, j'ai essayé de trouver l'index d'un article via

dates.index("0900-1045")

J'ai essayé différentes chaînes de recherche, celle ci-dessus, "'0900-1045'" et ['0900-1045'] mais quoi que je fasse j'obtiens 'ValueError: "' 0900-1000 '" n'est pas dans la liste' ou quoi que ce soit texte que j'ai utilisé. J'essaierais de chercher une chaîne partielle si possible mais je ne sais pas comment.

Une suggestion pourquoi elle n'est pas trouvée?

Stevo

1
Stevo 5 mars 2016 à 17:56

8 réponses

Meilleure réponse

De la façon dont vous l'avez publiée, vous ne trouverez pas l'entrée, car vous avez une liste de listes . Par conséquent, vous devrez rechercher dans la liste une liste et non une chaîne

dates = [['2015-2016'], ['24/08/15'], ['0900-1045'], ['1045-1100']]

dates.index(['0900-1045'])
2
Suever 5 mars 2016 à 15:05

Le problème est que vos «dates» ne sont pas une liste de chaînes - c'est une liste de LISTES de chaînes (toutes ces listes étant de longueur 1). Si vous utilisez plutôt dates.index (["0900-1045"]), l'index est calculé correctement. Il serait probablement préférable de réécrire votre code afin que «dates» ne soit qu'une liste de chaînes.

0
ahura 5 mars 2016 à 15:07

J'ai essayé ce qui suit -

Python 2.7.9 (default, Dec 10 2014, 12:28:03) [MSC v.1500 64 bit (AMD64)] on win32
Type "copyright", "credits" or "license()" for more information.

>>> dates = [['2015-2016'], ['24/08/15'], ['0900-1045'], ['1045-1100'], ['1200-1300'], ['1300-1430'], ['1430-1450'], ['1450-1550'], ['31/08/15'], ['0900-1030'], ['1200-1300'], ['1300-1600'], ['07/09/15', '18/09/15'], ['21/09/15'], ['0900-1000'], ['1100-1200'], ['1200-1300'], ['1400-1530']]
>>> dates.index("0900-1045")

Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    dates.index("0900-1045")
ValueError: '0900-1045' is not in list
>>> dates.index(['0900-1045'])
2

Comme vous l'avez dit, vous obtenez une liste de listes d'articles uniques, vous devez également rechercher l'index d'une liste dans la liste des dates, ce qui devrait être fait comme ceci -

Dates.index ("une liste")

0
Rajat Sharma 5 mars 2016 à 15:11

Alors que les autres réponses se sont concentrées sur la recherche de la sous-liste dans votre liste de listes qui contiennent votre chaîne cible, voici une méthode pour aplatir cette liste de listes afin que vous puissiez trouver directement l'index de la chaîne.

Donnée:

>>> dates = [['2015-2016'], ['24/08/15'], ['0900-1045'], ['1045-1100'], ['1200-1300'], ['1300-1430'], ['1430-1450'], ['1450-1550'], ['31/08/15'], ['0900-1030'], ['1200-1300'], ['1300-1600'], ['07/09/15', '18/09/15'], ['21/09/15'], ['0900-1000'], ['1100-1200'], ['1200-1300'], ['1400-1530']]

Vous pouvez aplatir la liste des listes (chacune contenant une chaîne) en une liste plate de cette façon:

>>> dates[:]=[string for li in dates for string in li]

Maintenant dates est une liste de chaînes:

>>> dates
['2015-2016', '24/08/15', '0900-1045', '1045-1100', '1200-1300', '1300-1430', '1430-1450', '1450-1550', '31/08/15', '0900-1030', '1200-1300', '1300-1600', '07/09/15', '18/09/15', '21/09/15', '0900-1000', '1100-1200', '1200-1300', '1400-1530']

Et votre .index d'origine fonctionnera:

>>> dates.index("0900-1045")
2
0
dawg 5 mars 2016 à 15:30

Si vous ne pouvez vraiment pas utiliser une liste comme index sur la version de python que vous utilisez, vous pouvez le faire

[ x[0] for x in dates ].index('24/08/15')  

Ou en utilisant une carte:

map(lambda(x):x[0], dates).index('24/08/15')

Mais utiliser une liste en tant qu'index est le meilleur à long terme: entrez la description de l'image ici

0
J.J 5 mars 2016 à 15:29

dates.index(["0900-1045"]) devrait fonctionner. Si ce n'est pas le cas, publiez votre code.

Pour rechercher une correspondance partielle, vous pouvez faire quelque chose comme

import re
filter(lambda x: re.search(partial_string,x[1][0]), enumerate(dates))

Pour obtenir la liste des correspondances avec des indices.

1
pyrocrasty 5 mars 2016 à 15:15

Vous devriez essayer dates.index (["0900-1045"]) comme commentaire de zondo. C'est parce que vous avez une liste qui contient des éléments de liste. Pour obtenir la position de l'élément dans une liste, vous devez passer l'argument de l'élément réel à la méthode d'index. Dans votre cas, les éléments sont des listes elles-mêmes, alors passez la liste.

0
NMN 5 mars 2016 à 15:26

Vous pouvez énumérer, filtrer et prendre la première correspondance:

index = next(index for (index, date) in enumerate(dates)
             if "0900-1045" in date)
0
Peter Wood 5 mars 2016 à 15:42