Python - Intersectiing chaînes
Essaie d'écrire une fonction qui prend deux chaînes de caractères et renvoie les personnages qui se croisent dans l'ordre où ils apparaissent dans la première chaîne.
Voici ce que j'ai essayé:
def strIntersection(str1, str2):
for i in str1:
str3 = ''
str3 = str3.join(i for i in str1 if i in str2 not in str3)
return str3
str1 = 'asdfasdfasfd'
str2 = 'qazwsxedc'
strIntersection(str1,str2)
=> 'asdasdasd'
cependant je ne veux le l'intersection des caractères n'apparaissent qu'une fois et dans l'ordre de la première chaîne ie. 'tsa'
Peut aider quelqu'un?
J'ai trouvé des problèmes similaires sur d'autres forums, mais les solutions semblent tous impliquent des listes alors que j'aimerais que mon la sortie de la chaîne
Vous devez vous connecter pour publier un commentaire.
Vérifier les événements dans l'autre sens pour obtenir l'ordre sous contrôle, et n'émettent pas de personnages que vous avez déjà émise:
Bien sûr, vous pourriez le ré-écrire pour être une compréhension de liste, mais je trouve cela plus facile à comprendre.
Pour vos données de test, nous obtenons:
''.join
est idiomatiques et pas compliqué du tout. L'utiliser dans une boucle, cependant, manque le point. En fait, la boucle for dans le po code est complètement inutile; il provoque le travail réel -str3 = str3.join(i for i in str1 if i in str2 not in str3)
à être exécutée plusieurs fois, avec le même résultat à chaque fois, et le résultat que l'on jette à chaque fois, mais la dernière.c in s2 and c not in out
dépend des résultats partiels, jusqu'à ce point, qui ne sont pas accessibles (sauf par très douteuse sans-papiers, des trucs).out
avec une liste d'accélérer les choses, mais a ensuite fait des timeit tests et déterminé qu'ils n'ont pas, donc j'ai supprimé mon ancien commentaire. Mes timings de montrer que cette solution utilisée 10.7 usec par boucle, Karls solution de 16,7 usec par boucle et mon modifiéeout = []
etreturn "".join(out)
solution de 18,5 usec par boucle.Vous voulez une chaîne composée des caractères uniques qui sont communes à
str1
etstr2
, dans l'ordre où ils apparaissent dansstr1
.L'unicité et l'identité implique l'ensemble des opérations: c'est, nous sommes à la recherche pour le jeu de caractères qui apparaissent dans les deux str1 et str2. Un ensemble est fondamentalement non ordonnée, mais nous pouvons réorganiser les données en les triant les personnages en fonction de leur "indice de la première occurrence dans
str1
. Ensuite, c'est une simple question de la création d'une chaîne à partir de la séquence triée.Mettre tous ensemble, nous obtenons:
Vous pouvez utiliser python ensembles http://docs.python.org/library/stdtypes.html#set pour ce faire, comme suit:
plus simple est d'utiliser des ensembles en python
Il ressemble à votre script devrait le faire si vous avez corrigé la faute de frappe sur la quatrième ligne:
devrait être
Je ne le recommande pas l'utilisation d'un ensemble pour cette simpy parce qu'ils ne garantissent pas l'ordre. Votre script est également susceptible d'être plus rapide.
(i for i in str1 if i in str2 and i not in str3)
. Sauf que cela ne fonctionne pas car lastr3
qui doit être comparée n'a pas été encore construit. Il a sa logique confus en essayant d'utiliser à la fois pour la boucle et de la compréhension. Comme pour les performances, je serais certainement s'attendreset
basée sur des approches pour être beaucoup plus rapide pour les chaînes longues.str3
n'est pas "la partie qui a déjà été construit". Soit vous exécutez ce code dans une boucle ou vous n'avez pas. Si vous ne le faites pas, alorsstr3
donnera une UnboundLocalError - vous essayez de se référer à la chose que vous assignez à. Si vous le faites, puis d'avoir unjoin
et une compréhension n'a pas de sens, puisque vous ne voulez examiner le caractère vs le trouvé l'intersection des personnages, et non pas l'ensemble de la chaîne.str3 = ''
et lastr3.join(...)
lors de sa lecture. J'étais crois que c'était dans une boucle.