python - 返回列表中数字的第一次出现索引

标签 python

我有一堆包含时间数据和数字的 csv 文件,我写了一个函数以这种方式返回第一次出现的低于阈值 (x) 的数字:

def bounce(tickList,x):
    n = 0
    for i in tickList:
        if float(i[1]) < x:
            return n
            break
        n += 1

除了当我以这种方式循环执行反弹函数时:

for i in os.listdir(resultDir):

    if "csv" in i:
        csvFile = resultDir+i
        print csvFile
        with open(csvFile, 'rb') as f:
            reader = csv.reader(f)
            tickList = []
            for line in reader:
                tickList.append(line)

        print bounce(tickList,5)

它不断返回零(即使第一个值高于阈值)。

我哪里错了?


这是其中一个 csv 文件的示例:

1373289767.454535,9.9
1373289769.728528,9.9
1373289771.817576,9.9
1373289773.813036,11.7
1373289775.810985,11.7
1373289777.769641,11.7
1373289779.783134,12.2
1373289781.774255,11.8
1373289783.799892,12.0
1373289785.812967,11.4
1373289787.816991,11.4
1373289789.790835,11.3
1373289791.811245,10.9
1373289793.880356,10.8
1373289795.846866,10.7
1373289797.847552,10.6
1373289799.858929,10.6

提前致谢。

编辑评论后

这是新功能:

def bounce(tickList,x):
    n = 0
    for i in tickList:
        if float(i[1]) < x:
            return n 
        n += 1

如果我打印 float(i[1]) 它会返回正确的数字,因此它会调用正确的文件。

第二次编辑

发现了问题,我给它提供的“级别”实际上是一个 str 而不是一个 int,感谢所有看过并提供帮助的人。

最佳答案

强烈怀疑您的缩进不正确,通过混合空格和制表符,Python 将您的方法解释为:

def bounce(tickList,x):
    n = 0
    for i in tickList:
        if float(i[1]) < x:
            return n
            break
    n += 1

哪里n += 1留在循环外面并且永远不会递增n .或者,n += 1可能缩进太远:

def bounce(tickList,x):
    n = 0
    for i in tickList:
        if float(i[1]) < x:
            return n
            break
            n += 1

您的函数将返回 0对于任何有 float(i[1]) 的行的情况下面x .

您可以通过使用 python -tt scriptname.py 运行脚本来测试此类问题, 其中-tt告诉 python 查找制表符和空格的不一致使用,并在发现此类问题时引发错误。

您可以使用 enumerate() 来简化您的代码,并内联测试,提前退出读取文件:

for fname in os.listdir(resultDir):
    if "csv" in fname:
        csvFile = os.path.join(resultDir, fname)
        print csvFile
        with open(csvFile, 'rb') as f:
            reader = csv.reader(f)
            for i, row in enumerate(reader)
                if float(row[1]) < 5:
                    print i
                    break    # exit for loop, continue with next file

内部for使用 next() 可以进一步简化循环和一个生成器表达式:

with open(csvFile, 'rb') as f:
    reader = csv.reader(f)
    print next((i for i, r in enumerate(reader) if float(r[1]) < 5), 'Not found')

作为next() 在找到结果后停止循环

关于python - 返回列表中数字的第一次出现索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17754160/

相关文章:

python - 如何通过组合元组和静态字符串来使用 itertools 创建字典

python - 如何在 Python 包中导入符号?

Python - 如何从不同的方法触发方法中的操作

python - 如何一次打印多个项目

python - 更新 tkinter Label 以在我的 python GUI 上显示文本文件,一次一行

python - 如何解决在NOX中Pydroid安装kivymd时出错?

python - 实例化Python中的所有函数

python - 从 Django 1.4 升级到 1.6 后在管理中保存对象时列出索引超出范围错误

python - 列表和子列表

python - 字符串 "NA"与pandas na类型冲突