Python在迭代期间返回字符串而不是列表

时间:2016-06-02 11:56:35

标签: python string list

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

.schedules--show .event__date {
  display: block;
}

.schedules--index .event__date {
  display: none;
}

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

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

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

但是,如果我运行以下内容:

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

第6行(编号为0)是一个值为for line in pdb: print line, len(line), type(line) 的字符串。如果我使用' 311'迭代enumerate(),也会发生这种情况。如果我使用pdub手动提取此元素,则它是一个包含16个元素的普通列表,值pdb[6]无法在此列表中显示。

这对我来说绝对毫无意义!

1 个答案:

答案 0 :(得分:0)

注意:仅在Python3.X

中为true

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
...