2014-08-28 2 views
0

У меня есть список строк, которые я сортирую. В списке есть 12 различных ключевых строк, которые я использую для сортировки. Поэтому вместо того, чтобы писать 12 отдельных списков, я хотел бы использовать список пустых списков и список строк ключей для сортировки, а затем использовать izip для выполнения учета списков. Вот что я делаю:Python IZIP list comprehension возвращает пустой список

>>> from itertools import izip 
>>> tran_types = ['DDA Debit', 'DDA Credit'] 
>>> tran_list = [[] for item in tran_types] 
>>> trans = get_info_for_branch('sco_monday.txt',RT_NUMBER) 
>>> for x,y in izip(tran_list, TRANSACTION_TYPES): 
    x = [[item.strip() for item in line.split(' ') if not item == ''] for line in trans if y in line] 
>>> tran_list[0] 
[] 

Я хотел бы видеть выход больше похоже на следующее:

>>> tran_list[0] 
[['DDA Debit','0120','18','3','83.33'],['DDA Debit','0120','9','1','88.88']] 

Выход не имеет смысла для меня; объекты, возвращаемые izip, являются списками и строками

>>> for x,y in itertools.izip(tran_list, TRANSACTION_TYPES): 
type(x), type(y) 
(<type 'list'>, <type 'str'>) 
(<type 'list'>, <type 'str'>) 

Почему этот процесс возвращает пустые списки?

ответ

1

Переменная очень похожа на наклейку.

Вы можете иметь несколько наклеек, расположенных на одном и том же:

>>> a=b=[]  #put stickers a and b on the empty list 
>>> a.append(1) #append one element to the (previously) empty list 
>>> b   #what's the value of the object the b sticker is attached to? 
[1] 

А может есть вещи, которые не имеют наклейку на все:

>>> a=[1,2,3] 
>>> a=""   #[1,2,3] still exists 

Хотя они не очень полезны, так как вы не можете ссылаться на них, поэтому они в конечном итоге garbage collected.


>>> for x,y in izip(tran_list, TRANSACTION_TYPES): 
    x = [[item.strip() for item in line.split(' ') if not item == ''] for line in trans if y in line] 

Здесь у вас есть наклейка с x в нем. Когда вы назначаете (x=...), вы меняете размещение наклейки - не изменяя места, где первоначально была установлена ​​наклейка.

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

Это верно для любого типа цикла в python и не имеет никакого отношения к izip в частности.

-1

Похоже, вы пытаетесь переставить переменную x обратно в tran_list после того, как она была заархивирована, но izip гарантирует, что возвращаемый тип является итератором, а не строгим указателем на исходный список. Вы можете потерять всю работу, которую вы делаете внутри цикла for, не осознавая этого.

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