Python: trouvez une liste parmi les membres d'une autre liste (dans l'ordre)
Si j'ai ceci:
a='abcdefghij'
b='de'
Puis ce trouve b:
b in a => True
Est-il un moyen de faire une chose de similaire avec les listes?
Comme ceci:
a=list('abcdefghij')
b=list('de')
b in a => False
Le "Faux" résultat est compréhensible car son, à juste titre, la recherche d'un élément "de", plutôt que (ce que j'arrive à le faire) " d "suivi par un "e"
C'est fonctionne, je sais:
a=['a', 'b', 'c', ['d', 'e'], 'f', 'g', 'h']
b=list('de')
b in a => True
Je peux croquer les données pour obtenir ce que je veux - mais est-il un court Pythonic façon de faire cela?
De préciser: j'ai besoin de préserver l'ordre ici b=['e','d'], doit retourner False).
Et si cela peut aider, ce que j'ai est une liste de listes: ces listes représente tous les chemins possibles (une liste de nœuds visités) à partir du nœud 1 au nœud x dans un graphe orienté: je veux facteur de sortir des chemins communs dans tous les chemins plus longs. (Alors à la recherche de tous les irréductibles 'atomique' les chemins qui constituante tous les chemins plus longs).
Connexes
source d'informationauteur monojohnny
Vous devez vous connecter pour publier un commentaire.
Ne sais pas si c'est très pythonic, mais je voudrais le faire de cette façon:
Plus courte solution est proposée dans ce discussionmais il souffre des mêmes problèmes que de solutions avec
set
- il ne considère pas l'ordre des éléments.Mise à JOUR:
Inspiré par MAK j'ai présenté plus concis et clair version de mon code.
Mise à JOUR:
Il y a des soucis de performance sur cette méthode, en raison de la liste de copie en tranches. Aussi, comme il est récursif, vous pouvez rencontrer limite de la récursivité pour de longues listes. Pour éliminer la copie, vous pouvez utiliser Numpy tranches qui crée des points de vue, pas de copies. Si vous rencontrez des performances ou de la limite de la récursivité questions que vous devriez utiliser la solution sans récursivité.
Je soupçonne qu'il y a plus pythonic façons de le faire, mais au moins, il fait le travail:
Je pense que ce sera plus rapide - Il utilise C mise en œuvre
list.index
à la recherche du premier élément, et va à partir de là.Noter que ce renvoie la position de la sous-liste, et pas seulement
True
ouFalse
. Si vous voulez juste unbool
vous pouvez utiliser ceci:J'ai programmé la solution retenue, ma solution et un nouveau avec un index. L'un avec l'indice est clairement meilleur.
EDIT: j'ai chronométré nosklo la solution, c'est même beaucoup mieux que ce que je suis venu avec. 🙂
Sortie en secondes:
4.51677298546
4.5824368
1.87861895561
0.357429027557
Donc, si vous n'êtes pas préoccupé par la commande le sous-ensemble apparaît, vous pouvez faire:
Modifier après vous préciser: Si vous avez besoin de préserver l'ordre, et la liste est en effet caractères que dans votre question, vous pouvez utiliser:
Cela devrait travailler avec ce couple de listes, de la préservation de l'ordre.
Est de vérifier si b est une sous-liste de un
Pas sûr de savoir comment la complexité de votre application, mais pour la correspondance de modèle dans les listes, pyparsing est très intelligent et facile à utiliser.
Utiliser les listes' représentation de chaîne et de supprimer les crochets. 🙂
EDIT: à Droite, il y a des faux positifs ... par exemple
is_sublist([1], [11])
. Merde réponse. 🙂