Python在i期间返回string而不是list

2024-04-25 01:34:47 发布

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

我遇到了这种我似乎无法解释的最出人意料的行为。我编写了一个Python函数,将PDB文件(蛋白质结构的原子坐标)解析为列表列表,例如:

[
['ATOM  ', ' 1700', '  N  ', ' ', 'VAL', ' B', '  11', ' ', '   ', matrix([[-19.164, -27.781, -11.31 ]]), '  1.00', ' 18.57', '      ', '    ', ' N', '  '],
...
]

当我按如下方式遍历列表时:

for line in pdb[:50]:
    print line, len(line), type(line)

我按预期得到每个元素,每个列表中有16个元素。你知道吗

但是,如果我运行以下命令:

for line in pdb:
    print line, len(line), type(line)

第6行(编号为0)是值' 311'的字符串。如果使用enumerate()pdub上迭代,也会发生这种情况。如果我使用pdb[6]手动提取这个元素,那么它是一个包含16个元素的普通列表,并且值' 311'不会出现在这个列表中。你知道吗

这对我来说毫无意义!你知道吗


Tags: 文件函数in元素列表forlentype
1条回答
网友
1楼 · 发布于 2024-04-25 01:34:47

注意:仅在Python3.X中为真

for i in l[1:](或者for i in list(l),只要切片不是懒惰的)和for i in l之间的主要区别是,如果l是一个生成器,第一个生成器将把整个生成器处理成一个列表,然后将它发送给for,而第二个生成器将处理l的一个元素:

from time import sleep
from multiprocessing import Pool
from random import randint
class Gen:
    def __init__(self, limit):
        self.__l = limit
        self.__t = []
        self.__v = 0

    def __iter__(self):
        return self

    def __next__(self):
        self.__v += 1
        if self.__v +1 >= self.__l:
            raise StopIteration
        print("NEXT:{}".format(self.__v))
        sleep(0.01)
        w = 0
        self.__t.append(self.__v)
        return self.__t[:]

r = Gen(1000)

所以呢

for i in r:
    sleep(0.2)
    print(" ->R:{}".format(i[-1]))

>>> NEXT:1
 ->R:1
NEXT:2
 ->R:2
NEXT:3
 ->R:3
NEXT:4
 ->R:4
NEXT:5
...

以及

for i in list(r):
    sleep(0.2)
    print(" ->R:{}".format(i[0]))

>>> NEXT:1
NEXT:2
NEXT:3 
NEXT:4
NEXT:5
...
 ->R:1
 ->R:2
 ->R:3
 ->R:4
...

相关问题 更多 >