2010-11-21 16 views
1

Une question très populaire est de savoir comment inverser une chaîne de style C. La chaîne de style C par définition est une chaîne qui est terminée par un caractère nul ('\ 0'). En utilisant C (ou peut-être C++), il est possible d'utiliser des pointeurs pour manipuler la chaîne afin d'inverser son contenu sur place.Chaînes 'style C' en Python

Si quelqu'un pose la question «Comment inverser une chaîne de style C en Python?», Quelles seraient les réponses possibles?

Merci

+3

Quelle est votre définition d'une "chaîne de style C" en Python? Une chaîne Python avec un '\ x00' final? Ou quelque chose qui vient d'une extension C? –

Répondre

4

Si vous devez "inverser une chaîne de style C en Python", je pense que le résultat final doit également être une chaîne de style c.

Voilà comment je comprendrais la question, mais les réponses ci-dessus ne pas soutenir cela.

Voir la séance interactive ci-dessous:

>>> 
>>> original = "abc\0" 
>>> finish_correct = "cba\0" 
>>> original 
'abc\x00' 
>>> finish_correct 
'cba\x00' 
>>> 
>>> answer = original[:-1] # remove final null 
>>> answer = answer[::-1] # reverse string 
>>> # Extended slice syntax: [begin:end:step] 
>>> # So, [::-1] means take whole string, but in reverse. 
>>> answer 
'cba' 
>>> answer = answer + "\0" 
>>> answer 
'cba\x00' 
>>> answer == finish_correct 
True 

A noter également, les chaînes Python sont immuables. Cela signifie qu'ils ne peuvent jamais être changés. Vous pouvez créer de nouvelles chaînes affectées au même nom de variable, mais l'image en mémoire d'une chaîne donnée ne changera jamais. Ainsi, la notion de "renverser une chaîne en place" ne peut pas arriver en Python.

Espérons que cela aide. Si oui, veuillez voter et accepter la réponse. Merci. :-)

+0

@sc_ray Est-ce que cela répond à votre question? – nonot1

+0

Bonne réponse. Merci! –

3

Python n'utilise pas les chaînes de style C; Les chaînes Python peuvent contenir un NUL intégré, donc les chaînes de style C ne sont pas utilisées, mais plutôt une longueur explicite.

>>> 'abc\0def'[::-1] 
'fed\x00cba' 
+0

Merci. Pouvez-vous s'il vous plaît expliquer votre extrait ici? Le '\ 0' est-il le NUL intégré auquel vous faites référence? –

+0

Il utilise un découpage étendu pour renvoyer une séquence du début à la fin de la séquence source, mais dans l'ordre inverse. Le '\ 0 'dans la chaîne est en effet un NUL embarqué. http://docs.python.org/release/2.3.5/whatsnew/section-slices.html –

+0

'' abc \ 0def'' n'est pas une chaîne de style c, ni '' fed \ x00cba''. – martineau

3

Puisque C ne dispose pas d'un type de chaîne, il représente des chaînes de caractères comme des pointeurs vers char, où le dernier octet (en supposant ASCII, sans caractères larges) est \0. C'est une représentation . En passant, cette implémentation par défaut a l'inconvénient que \0 ne peut pas faire partie d'une telle chaîne. Si cela est nécessaire, une représentation différente est requise (comme représenter une chaîne comme un pointeur + un entier de longueur).

Python, OTOH a un type de chaîne, et il est opaque à l'utilisateur comment ce type est représenté. Par conséquent, une "chaîne de style C" est un concept dénué de sens en Python.

1

Les chaînes python sont immutable. Vous pourriez émuler une chaîne de style c avec une table de caractères, mais je ne vois pas pourquoi vous dérangeriez. Mais si vous aviez une "chaîne" de style c (c'est-à-dire une table de caractères), alors tout ce que vous avez à faire est d'échanger s [i] avec s [len (s) -i-1]:

for i in range(0,len(a)-2): 
a[i],a[len(a)-1-i]=a[len(a)-1-i],a[i] 

(si votre chaîne est de style c)

Notez que vous n'avez pas besoin d'une variable temporaire (accordée vous ne avez pas besoin en C soit, compte tenu de la façon dont vous pouvez utiliser le null caractère en tant qu'espace temporaire).

+2

Tellement pour Python que l'application du code clair ... – delnan

+0

@delnan: Ce serait un peu mieux si le code de la réponse avait été correctement mis en retrait (le code affiché n'est pas syntaxiquement correct en Python). Il aurait pu être rendu encore plus sensible si des espaces blancs optionnels avaient été ajoutés. Cela dit, il peut encore être difficile de comprendre ce que ou comment le code écrit fait son travail et accomplit sa tâche à moins que vous ne compreniez l'algorithme impliqué. – martineau