首页 > 解决方案 > for 循环中的某些对象没有迭代

问题描述

我试图通过 for 外观运行,当我以某种方式通过代码时遇到问题。我正在运行我的代码的以下部分:

for f in adg1:
    sptline2 = f.split(' ') #delimits line using a space
    sptline3 = list(filter(None, sptline2))

目前,它贯穿 sptline2 部分,当我打印它时,sptline2 返回一个输出。但是,当我到达 sptline3 时,没有任何内容作为 sptline3 返回。当我在可以调用该函数的位置键入相同的代码时,会为 sptline3 分配一个值,但是当它在代码中运行时,它会返回一个空列表。

这不是全部代码,因此本节中可能缺少一些可能会有所帮助的内容,我可以根据需要添加这些内容。我遇到问题的代码的相关部分如下:

for f in adg1:
     sptline2 = f.split(' ') #delimits line using a space
     sptline3 = list(filter(None, sptline2)) #removes empty values
     for x in sptline3:
     if sptline3.index(x) == len(sptline)-1: #gets last value
         adgvals.append(x) #adds adg values into list 
         for ad in adgvals:
             ad1 = ad.strip('"')
             ad2 = ad1.replace('444.000\n', '444.0')
             ad3 = ad2.strip('\n')
             adgvals2.append(ad3)

adg1 的示例如下:

[ '   8903  31 2310   1.378\n', '   8903  31 2320   1.378\n', '   8903  31 2330 444.000\n', '   8903  31 2340 444.000\n', '   8903  31 2350   1.378\n']

sptline2 的示例输出如下:

['', '', '', '8903', '', '31', '2350', '', '', '1.378\n']

我收到的错误是关于遍历空列表并尝试添加新的(不存在的)值。

print(sptline3)
[]

我期望为 sptline3 获得以下信息:

['8903','31', '2350', '1.378\n']

最终期望从每个 sptline3 的最后一列中获取所有值的列表,用于 adgvals2 的输出:

['1.378\n', '1.378\n', '1.378\n', '1.378\n', '1.378\n', '1.377\n']

如果您有任何问题,请告诉我,谢谢!

标签: python

解决方案


您的问题来自您的 if 语句,应该是

for f in adg1:
sptline2 = f.split(' ')
sptline3 = list(filter(None, sptline2))
for x in sptline3:
    if sptline3.index(x) >= len(sptline3)-1:

您的情况不正确,这就是它返回的原因,您应该与 sptline3 的 len 而不是 sptline 进行比较

除此之外,您的代码中仍然存在错误,您所做的将给出重复的最终结果,或者 3 或更多.. 但这会给您预期的结果

adg1 = [ '   8903  31 2310   1.378\n', '   8903  31 2320   1.378\n', '   8903  31 2330 444.000\n', '   8903  31 2340 444.000\n', '   8903  31 2350   1.378\n']
adgvals = []
adgvals1 = []
for f in adg1:
sptline2 = f.split(' ')
sptline3 = list(filter(None, sptline2))
for x in sptline3:
    if sptline3.index(x) >= len(sptline3)-1:
        adgvals.append(x)
        if len(adgvals) == len(adg1):
            for ad in adgvals:
                ad1 = ad.strip('\n')
                ad2 = ad1.replace( '444.000\n', '440')
                adgvals1.append(ad2)

有更短的方法可以实现这一点,但这遵循您的初始模式


推荐阅读