Python:list()不知何故就位?

时间:2017-11-05 07:12:20

标签: python list pandas

在使用我不理解的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中发生了什么。

1 个答案:

答案 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
{}