2012-06-06 5 views
7

gelernt Nur 3 Python in 7 Tagen, und ich habe das Gefühl, dass ein bisschen ein Loch da ist. In Python 3 nehme ich an, dass ich eine Byte-Zeichenfolge b'1234' habe. Sein Iterator gibt ganze Zahlen:Python 3 bytes.index: besserer Weg? in meinem Verständnis von Bytefolgen

Python 3.2.3 (default, May 26 2012, 18:49:27) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 

>>> for z in b'1234': 
... print(type(z)) 
... 
<class 'int'> 
<class 'int'> 
<class 'int'> 
<class 'int'> 

I eine ganze Zahl im Bytestring finden (die Definition von in ist, dass es für die Gleichstellung sucht):

>>> 0x32 in b'1234' 
True 

aber ich mag den Index finden einer gegebenen Ganzzahl in der Byte-Zeichenfolge. bytes.index erfordert einen Teil:

>>> b'1234'.index(b'2') 
1 

Nun, wenn ich eine Variable x habe, dass wir finden wollen, ist dies das Beste, was ich habe kommen mit:

>>> x = 0x32 
>>> b'1234'.index(bytes([x])) 
1 

Ich weiß, Python ist eleganter als die. Ich vermisse eindeutig etwas Offensichtliches. Irgendwelche Ideen für einen einfacheren Weg, dies zu tun, als eine Sequenz einer einzelnen ganzen Zahl zu erzeugen? Oder ist es das wirklich?

+1

Die Frage hinter auch ist, warum wollen Sie den Index des Bytes zu finden? – pepr

+0

Wenn Sie wissen müssen :) Es ist Teil einer virtuellen Maschine ist, von deren Anweisungen muss den Index eines Byte gefunden. Es implementiert Version 3 der Z-machine-Spezifikation, die zum Spielen von Zork und anderen Textabenteuern verwendet wird, die auf dieser Engine basieren. Wenn Sie es ausprobieren möchten, finden Sie es unter http://code.google.com/p/pymachine. Es ist meine erste Anstrengung, also werden Punkte für Verbesserungen geschätzt. –

Antwort

5

Ja, das ist der Weg, es zu tun.

Aus der Art und Weise nicht viel anders ist für ein Zeichen in einer Zeichenfolge basierend auf seinem Codepunkt zu suchen:

x = 0x32 
i ='1234'.index(chr(x)) 
+0

Interessant - ich hatte nicht bemerkt, dass chr() eine Zeichenfolge erstellt. Es scheint, dass Strings die einzige Möglichkeit darstellen, eine Instanz des Elementtyps einer Zeichenfolge darzustellen. –

+0

@RobertB: Ja. Python kennt den Char-Typ nicht. Das Zeichen (im Gegensatz zu anderen Sprachen) ist technisch nur die Zeichenfolge mit der Länge 1. – pepr

0

Auch einen Blick auf Mark Pilgrim Dive Into Python 3 Kapitel 4. Strings, Abschnitt 4.6. Strings vs. Bytes. Es erklärt schön was sind die Probleme mit älteren Python 2.x Strings (die den Typ Bytes in Python 3 wurde) und wie die neue Python 3 String grundsätzlich unterscheidet.