我无法弄清楚为什么我的下面代码不会为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)
这就是没有指定任何数据/文本文件的原因。
提前,谢谢!
答案 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