在使用我不理解的list()
时,我发现了顺序依赖。我从zip mytup
开始,我测试了3个版本的代码,结果如下。 df_q
是常规的pandas DataFrame:
#ver1
df_q.loc[list(mytup)] # first access works fine
df_q.loc[list(mytup)] # TypeError: Cannot infer number of levels from empty list
#ver2
list(mytup)
df_q.loc[mytup] # TypeError: object of type 'zip' has no len()
df_q.loc[mytup]
#ver3 works as excepted
mylist = list(mytup)
df_q.loc[mylist]
df_q.loc[mylist]
对我而言,由于我只是在ver1
的第二次调用中遇到错误,我最初认为list()
某种程度上有一些未记录的就地行为,但显然它不是ver2
1}}不起作用。 ver3
按预期工作,但我不明白1/2中发生了什么。
答案 0 :(得分:8)
问题是zip
返回一个zip对象,它是一个迭代器。大多数表现良好的迭代器都是单遍的:
>>> z = zip((1,2),('a','b'))
>>> z
<zip object at 0x10193a908>
>>> next(z)
(1, 'a')
>>> next(z)
(2, 'b')
>>> next(z)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
>>> list(z)
[]
换句话说:
>>> z = zip((1,2),('a','b'))
>>> first = list(z)
>>> second = list(z)
>>> first
[(1, 'a'), (2, 'b')]
>>> second
[]
因此,如果您想重新使用压缩值,您需要在物化列表中保留一个参考,就像您在第三次尝试时一样。
为了清楚起见,这并不是list
函数所特有的,而是任何遍历zip-object的东西:
>>> z = zip((1,2),('a','b'))
>>> d1 = dict(z)
>>> d2 = dict(z)
>>> d1
{1: 'a', 2: 'b'}
>>> d2
{}