Python:list()是否就位了?

2024-09-30 18:16:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我在使用list()时观察到一个顺序依赖,我不明白。我从一个zipmytup开始,测试了3个版本的代码,结果如下。df_q是常规数据帧:

#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不起作用。ver3按预期工作,但我不明白1/2中发生了什么。你知道吗


Tags: of代码版本df顺序loclistworks
1条回答
网友
1楼 · 发布于 2024-09-30 18:16:55

问题是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
[]

因此,如果您想重用zipped值,您需要保留对物化列表的引用,就像您在第三次尝试中所做的那样。你知道吗

要清楚的是,这并不是特定于list函数的,而是针对在zip对象上迭代的任何对象:

>>> z = zip((1,2),('a','b'))
>>> d1 = dict(z)
>>> d2 = dict(z)
>>> d1
{1: 'a', 2: 'b'}
>>> d2
{}

相关问题 更多 >