2012-06-06 13 views
7

Po prostu nauczyłem się Pythona 3 w 7 dni, i mam wrażenie, że jest trochę dziury w moim rozumieniu ciągów bajtowych. W Pythonie 3 załóżmy, że mam ciąg bajtowy b'1234'. Jego iterator zwraca liczby całkowite:Python 3 bajty.indeks: lepszy sposób?

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'> 

mogę znaleźć liczbę całkowitą w ciąg bajtów (definicja in jest to, że szuka równości):

>>> 0x32 in b'1234' 
True 

Jednak chciałbym znaleźć indeks danej liczby całkowitej w ciągu bajtów. bytes.index wymaga podciąg:

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

Teraz, jeśli mam zmienną x że chcę znaleźć, jest to najlepszy jaki wymyślić:

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

wiem Python jest bardziej elegancki niż to. Wyraźnie brakuje mi czegoś oczywistego. Wszelkie pomysły na prostszy sposób zrobić to poza tworzeniem sekwencji pojedynczej liczby całkowitej? Czy to naprawdę to?

+1

Pytanie również brzmi: dlaczego chcesz znaleźć indeks bajtu? – pepr

+0

Jeśli musisz wiedzieć :) Jest to część wirtualnej maszyny, której instrukcja wymaga znalezionego indeksu bajta. Wprowadza wersję 3 specyfikacji Z-machine, używanej do grania Zork i innych tekstowych przygód opartych na tym silniku. Jeśli chcesz to sprawdzić, odwiedź http://code.google.com/p/pyzmachine. To mój pierwszy wysiłek, dlatego docenia się punkty, które należy ulepszyć. –

Odpowiedz

5

Tak, to sposób na zrobienie tego.

To nie wiele różni się od sposobu, aby szukać znaku w ciągu znaków na podstawie punktu kodu:

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

Interesujące - nie zdawałem sobie sprawy, że chr() utworzył ciąg znaków. Wydaje się, że w istocie łańcuchy są jedynym sposobem reprezentowania jednego wystąpienia typu elementu łańcucha. –

+0

@RobertB: Tak. Python nie zna typu znaku. Postać (w przeciwieństwie do innych języków) jest technicznie tylko ciągiem o długości 1. – pepr

0

również przyjrzeć się Mark Pielgrzyma Zanurkuj w Pythonie 3 rozdział 4. Strings, Sekcja 4.6. Strings vs. Bytes. To ładnie wyjaśnia, jakie są problemy ze starszymi napisami w Pythonie 2.x (które stały się typem bajtów w Pythonie 3) i jak nowy kod Python 3 string zasadniczo się różni.