2015-12-15 3 views
0

Я пытаюсь описать различия между двумя строками, используя результат метода compare(a,b) класса Differ, определенного в difflib в python. Я использую compare(a,b) следующим образом.Результат Differ.compare() исчезает после использования один раз

s1 = ["one", "three", "twoo"] 
s2 = ["one", "tow", "tree"] 
d = difflib.Differ() 
result = d.compare(s1, s2) 

# without this for loop, the result is as expected 
for r in result: 
    print(r) 

desc = describe_diff(result) 
for k, value in desc.items(): 
    print(k, value) 

Моя проблема, когда я напечатать result перед его передачей в функцию describe_diff, которую я создал, результат не так. Но когда я прокомментирую цикл for, который печатает result, выход в порядке. Я пробовал печатать result, используя два для петель один за другим, но он печатается только один раз. Однако, когда я вставляю compare(s1,s2) между двумя циклами (или между контуром печати и моим вызовом функции describe_diff), все в порядке. Итак, чтобы использовать значение result несколько раз, мне нужно каждый раз выполнять метод compare? Должен быть какой-то способ обойти это. Пожалуйста помоги.

ответ

1

Это потому, что compare дает вам объект-генератор, который будет исчерпан после повторного его повторения. Вы можете включить генератор в список, если хотите использовать результат несколько раз.

Генератор будет пустым после одной итерации:

>>> from difflib import Differ 
>>> s1 = ["one", "three", "twoo"] 
>>> s2 = ["one", "tow", "tree"] 
>>> result = Differ().compare(s1, s2) 
>>> result 
<generator object compare at 0x7f017de9f1b0> 
>>> for x in result: 
...  pass 
... 
>>> list(result) 
[] 

Кастинг генератора в список (до итерации над ним):

>>> result = Differ().compare(s1, s2) 
>>> list(result) 
[' one', '+ tow', '- three', '? -\n', '+ tree', '- twoo'] 

Обратите внимание, что после того, как вы бросили генератор в список, он будет исчерпан вновь:

>>> result = Differ().compare(s1, s2) 
>>> foo = list(result) # foo is now [' one', '+ tow', '- three', '? -\n', '+ tree', '- twoo'] 
>>> list(result) 
[] 
+0

Большое спасибо! Я знаю, что такое генераторы и как они работают. Похоже, я должен был взглянуть на тип возвращаемого метода 'compare' из документации, прежде чем размещать здесь вопрос. –

+0

На самом деле пример в документации показывает, что они сделали список первым. Это из документации: '>>> result = list (d.compare (text1, text2))' –

Смежные вопросы