0
votes

Comment retourner une liste d'éléments dans une chaîne tout en préservant l'ordre d'origine des éléments à Python

Je suis coincé sur ce défi de codage de Codewars:

"Implémentez la fonction unique_in_order qui prend comme argument une séquence et retourne une liste d'éléments sans aucun élément de la même valeur et préservant l'ordre d'origine de éléments. "

" Par exemple: xxx

"

C'est à quelle distance je pouvais venir jusqu'à présent: < / p> xxx

qui me fait une sortie de: xxx

pour l'entrée suivante: xxx < / Pré>

au lieu de la sortie souhaitée de: xxx

J'apprécie votre aide.


5 commentaires

SET () renvoie des éléments uniques dans la liste donnée


@Elsheikh, ça ne sauvera pas la commande


Set commandé préserve la commande


Utilisation de l'ensemble n'est pas ce que vous devez faire ici, la fonction ne veut pas que les éléments uniques, il veut essentiellement [k pour k, _ in iteroTools.groupby (itérêtant)]


@Olvinroght je sais, je l'informe juste avec ce que défini () fait


6 Réponses :


1
votes

définir crée un objet avec chaque élément de la liste uniquement une fois. Au lieu d'une fonction intégrée, vous allez devoir écrire quelque chose vous-même. Comment faire cela?

Premièrement, créez l'entrée et une liste qui va trouver votre résultat: xxx

maintenant, ce que nous ferons est de boucler sur le mot, et chaque Nouvelle lettre que nous appendons. Nous devons donc suivre ce que la lettre "actuelle" est la suivante: xxx

Au début, nous l'avons défini sur aucun parce que nous n'avons pas encore de lettre actuelle. Maintenant, nous avons une boucle sur le mot: xxx


0 commentaires

0
votes

Vous pouvez essayer cela.

itérer à travers la chaîne. Chaque fois que ith em> élément et ith + 1 em> ne correspond pas à l'élément em> à la liste `res. P> xxx


iTERTOOLS.GROUPBY ( ) code> peut être utilisé ici. P>

from itertools import groupby
def unique_order(_iter):
    return [k for k, g in groupby(_iter)] #'AAAABBBCCDAABBB'--> ['A', 'B', 'C', 'D', 'A', 'B']


0 commentaires

1
votes

Le moyen le plus simple serait de le faire:

>>> string = "AAAABBBCCDAABBB"
>>> new_list = []
>>> for i in string:
...     if not new_list:
...             new_list.append(i)
...     elif new_list[-1] != i:
...             new_list.append(i)
...
>>> new_list
['A', 'B', 'C', 'D', 'A', 'B']


0 commentaires

0
votes

Vous devez utiliser itheroTools.groupby code>. Le comportement que vous voulez est identique à la commande uniq code>. Comme le Doc dit, groupby code> a Un aussi semblable à Behviour.

>>> import itertools
>>> [k for k, _ in itertools.groupby('AAAABBBCCDAABBB')]
['A', 'B', 'C', 'D', 'A', 'B']
>>> 


0 commentaires

1
votes

Vous pouvez le faire facilement avec une compréhension de la liste à l'aide de zip code> et de la découpage nifty. C'est fondamentalement la recette par paire sans utiliser iTerTools. Si vous voulez que vous puissiez regarder cette recette si vous en avez besoin aussi.

result = [it[0]]
for c, nc in zip(iterable, iterable[1:]):
    if c != nc:
        result.append(nc)


0 commentaires

0
votes
def unique_in_order(iterable):
    output = []
    letter = None
    for current in iterable:
        if current != letter:
            output.append(current)
            letter = current

    return output

0 commentaires