我有一个我正在排序的字符串列表。列表中有12个不同的键字符串,用于排序。因此,我不想编写12个单独的列表推导,而是使用空列表列表和要排序的关键字符串列表,然后使用izip执行列表推导。这就是我在做的事情:
>>> 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'>)
为什么这个过程会返回空列表?
答案 0 :(得分: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=...
)时,您正在更改贴纸的位置 - 而不是修改贴纸原本放置的位置。
您正在为每个for循环周期分配的变量赋值。 您的作业完全没有效果。
对于python中的任何类型的for循环都是如此,并且特别是与izip
没有任何关联。
答案 1 :(得分:-1)
看起来你试图将变量x压缩到tran_list之后将其填充到tran_list中,但是izip只保证返回的类型是迭代器,而不是它是一个严格的指针回到原来的清单。你可能会失去你在for循环中所做的所有工作而没有意识到这一点。