为for循环python中的行赋值

时间:2017-06-05 09:58:04

标签: python for-loop count mapper

我无法弄清楚为什么我的下面代码不会为for循环中的第n行分配新值。据我所知,我索引b矩阵的方式应该是正确的,但似乎count变量不会为每次迭代更新。 打印语句仅用作检查正在发生的事情的方式。

我认为这很简单,所以如果有人能指出我错了,我会非常感激。

const a = {
	"meeting_summaries":[
    {
        "id":1,
        "company_id":7,
        "interaction_id":22,
        "nature":"1",
        "user_id":1,
        "action":"Action Test 1",
        "feedback":"Comment Test 1",
        "created_at":"2017-06-04 10:15:02",
        "updated_at":"2017-06-04 10:15:02",
        "deleted_at":null,
        "client_name":"Test Company 4",
        "mention_name":"Analyst"
    },
    {
        "id":2,
        "company_id":8,
        "interaction_id":22,
        "nature":"2",
        "user_id":1,
        "action":"Action Test 2",
        "feedback":"Comment Test 2",
        "created_at":"2017-06-04 10:15:02",
        "updated_at":"2017-06-04 10:15:02",
        "deleted_at":null,
        "client_name":"Test Company 5","mention_name":"Analyst"
    }
  ]
};

const nature = [
    {value: 1, label: "Demo 1"},
    {value: 2, label: "Demo 2"},
    {value: 3, label: "Demo 3"},
    {value: 4, label: "Demo 4"},
    {value: 5, label: "Demo 5"}
]

const res = a.meeting_summaries.map(ms => Object.assign(ms, 
  (nature.find(n => n.value == ms.nature)) // if corresponding object exists
    ? { nature_name: nature.find(n => n.value == ms.nature).label } : {}
))

console.log(res)

我使用以下命令在Ubuntu终端内执行代码。

#!/usr/bin/python
import sys
#from string import maketrans
#import re
import numpy as np

lines = sum(1 for line in sys.stdin)
b = np.zeros((lines,2))

count = 0
for line in sys.stdin:

    line = line.strip()
    myline = line.split(",")

    Depart = myline[3]
    DepartDelay = float(myline[6])  

    if DepartDelay<0:

        DepartDelay=0

    b[count,0] = Depart
    b[count, 1] = DepartDelay

    count = count + 1
    print(count)
print(b)
print(count)    

这就是没有指定任何数据/文本文件的原因。

提前,谢谢!

2 个答案:

答案 0 :(得分:0)

sys.stdin基本上是一个文件对象,所以我认为不要做像for line in sys.stdin这样的事情(它可能在技术上有用,但它的形式很糟糕。另外,你还有其他问题,一切都在前面)

我更愿意在sys.stdin上调用read()readlines()方法来读取内容

熟悉stdin的基础知识:How do you read from stdin in Python?

一个适合你的循环应该如下所示:

lines = sys.stdin.readlines()
for line in lines:
    do_something(line)

但要小心,如果你在程序开始时迭代整个标准输入(当你lines = sum(1 for line in sys.stdin)时),你就不能再开始迭代了

更简单的方法是阅读上面提到的所有行,但如果你需要行的长度,你可以先做到这一点:

count_lines = len(lines)

总结一下,你的程序的开头应该是:

lines = sys.stdin.readlines()
b = []
count = 0
for line in lines:
    Depart, DepartDelay = do_something(line)
    b.append([Depart, DepartDelay])

编辑:我根本不会使用numpy这么简单的问题,需要存储多种类型(浮点数和字符串)

答案 1 :(得分:0)

核心问题似乎是你在sys.stdin两次阅读。一旦进入sum的参数,它将读取整个输入,然后再次进入for循环。因为文件具有当前位置,通常的结果是for循环无需处理。 stdin也可能是一个流,所以不能重绕。您只能加载一次数据。

第二个问题是,您是否可以使用更高的抽象级别加载数据。看起来你正在阅读一个CSV,csv.reader可能有用,但它是在一个numpy数组中收集的,这使得numpy.loadtxt更具吸引力。它甚至有一个usecols字段来读取特定列。

count变量也可以使用for count, line in enumerate(sys.stdin):更轻松地处理。这会随着线的读数而增加。

我认为一个不错的起点就像:

b = np.loadtxt(sys.stdin, delimiter=',', usecols=(3,6))
b[:,1] = np.maximum(b[:,1], 0)   # Set no lower than 0