2015-01-29 3 views
0

Я видел этот же вопрос, заданный вокруг, но это всегда что-то вроде:Python3 ValueError: слишком много значений для распаковки с петлей для

val1, val2 = input("Enter 2 numbers") 

Моя проблема отличается.

У меня есть две строки, str1 и str2. Я хочу, чтобы сравнить их байт за байтом, так что результат будет выглядеть примерно так:

str1 str2 
0A 0A 
20 20 
41 41 
42 42 
43 43 
31 31 
32 32 
33 33 
2E 21 

Итак, я пробовал различные синтаксисом, чтобы сравнить их, но это всегда заканчивается в одной и той же ошибки. Вот один из моих последних попыток:

#!/usr/bin/python3 
for c1, c2 in (tuple("\n ABC123."), tuple("\n ABC123!")): 
    print("%02X %02X" % (ord(c1), ord(c2))) 

И ошибка:

$ python3 test.py 
Traceback (most recent call last): 
    File "test.py", line 1, in <module> 
ValueError: too many values to unpack (expected 2) 

Конечно, эта линия:

for c1, c2 in (tuple("\n ABC123."), tuple("\n ABC123!")): 

прошла через множество различных итераций:

for c1, c2 in "asdf", "asdf" 
for c1, c2 in list("asdf"), list("asdf") 
for c1, c2 in tuple("asdf"), tuple("asdf") 
for c1, c2 in (tuple("asdf"), tuple("asdf")) 
for (c1, c2) in (tuple("asdf"), tuple("asdf")) 

Все они бросали один и тот же e rror.

Я не думаю, что я вполне понимаю синтаксис zipping/unzipping синтаксиса python, и я готов приступить к взлому решения низкого уровня вместе.

Любые идеи?

+0

Я должен упомянуть, что утилита для этого состоит в том, что одна из строк является внутренней, а другая - из файла. Несмотря на то, что они читают то же самое, они не соответствуют друг другу, поэтому я ожидаю, что в конце у него есть дополнительные управляющие символы, такие как '0A', и именно это я пытался выяснить, когда я столкнулся с этой ошибкой. –

+0

Обновление: [Я знал это!] (Http://pastebin.com/8YQk1uME) Python включает в себя '0A' с конца файла. –

ответ

0

Хорошо, так что я в конечном итоге делает это:

for char in zip(s1,s2): 
    print("%02X %02X" % (ord(char[0]), ord(char[1]))) 

Однако я заметил, что если я, случается, есть два списка различной длины, тем длиннее список, кажется, обрезано в конце. Например:

s1 = "\n ABC123." 
s2 = "\n ABC123!." 
0A 0A 
20 20 
41 41 
42 42 
43 43 
31 31 
32 32 
33 33 
2E 21 
#  !! <-- There is no "2E" 

Так что я думаю, я мог бы работать по всему, что напечатав len() для каждой строки, а затем дополняя тем короче один, чтобы встретить больше один.

+0

[Да] (http://pastebin.com/8YQk1uME). 'Застежка-молния (s1, s2 [: - 1])' –