【发布时间】:2011-03-08 01:53:13
【问题描述】:
我有 csv 输入文件,我们称之为 heights.csv。我的示例文件只有四行,但不能限制。 第一列只包含不相关的名称,第二列包含我想要处理为整数的值。
1000,57020,
2003,56095,
2007,55964,
3001,57020,
我想执行如下操作:
first_read_a = 第一行的值 + 第一个 random.randint(500, 1000)
second_read_a = 第一行的值 + first_read - 下一行的值
third_read_a = 第一行的值 + random.randint(500, 1000) - 下一行的值
Fourth_read_a = 第一行的值 + random.randint(500, 1000) - 下一行的值
如果列表会更长,直到最后一行没有下一行且没有下一个要减去的值,则依此类推。
该过程的结果必须以某种方式存储和索引,因为下一个任务
是使用生成的值向后执行类似的操作。
first_read_b = 最后一行的值 + Fourth_read_a - 最后一行的值
依此类推,直到这次从列表开头的第二行,而不是第一行。
我有示例代码,但它非常有限,我想问你一个有效的解决方案的例子。
import random
a = [57020, 56095, 55964, 57020]
compute = input(">")
if compute == 1:
read_0a = random.randint(500,1000)
read_1a = a[0] + read_0a - a[1]
read_2a = a[1] + random.randint(500,2300) - a[2]
read_3a = a[2] + random.randint(500,2300) - a[3]
read_1b = a[3] + read_3a - a[2]
read_2b = a[2] + read_2a - a[1]
print read_0a, read_1a, read_2b, read_2a, read_1b, read_3a
print read_1a + read_2a + read_3a
print read_0a + read_1b + read_2b
交易是将脚本开发成这样的形式,它可以处理输入 *.csv 文件并按照我的示例脚本中的方式生成合适的整数,但无需定义列表 ['a' list在示例中] 手动并为每个“read”说明如何生成它。我想知道,如何索引 csv 文件以及如何将索引项作为整数而不是字符串访问,以及如何通过索引触发这些整数。
----------- -------------------------------------------------- --
让我解释一下。
我们有 eyquem 的高级脚本:
import csv
import random
with open('heights.csv','rb') as f:
a = [int(row[1]) for row in csv.reader(f)]
print 'a==',a
compute = input(">")
if compute == 1:
read_a = dict((i+1,a[i] + random.randint(500,2300) - a[i+1])
for i in xrange(0,len(a)-1) )
read_a[0] = read_a[1] - a[0] + a[1]
read_b = dict( (i, a[len(a)-1] + read_a[len(a)-i] - a[len(a)-i-1])
for i in xrange(1,len(a)-1))
print read_a, read_b
我们得到示例结果:这是输入列表:a== [57020, 56095, 55964, 57020]<br>
并生成“读取”:{0: 1637, 1: 2562, 2: 1991, 3: 4} {1: 1060, 2: 2916}
让我们检查一下:
57020 + 1637 - 2562 = 56095 [正确!因为它等于列表中的第二个值]
所以让我们取列表中的第二个值并继续:
56095 + 1991 - 1060 = 57026 [错误,因为它不等于列表中的第三个值]
所以现在剩下的会给我们错误的结果。
正确的依赖关系如下:
让我向您展示我想要的结果,使用我发布的 [原始] 第一个脚本生成的“读取”示例值:
a = [57020, 56095, 55964, 57020]
57020 #列表中的第一个值
+712 #read_0a = random.randint(500,1000)
-1637 # read_1a = 1st + read_0a - 2nd
[=]56095 #列表中的第二个值
+772 #read_2b = 3rd + read_2a - 2nd
-903 #read_2a = 2nd + random.randint(500,2300) - 3rd
[=]55964 #列表中的第三个值
+1279 #read_1b = 4th] + read_3a - 3rd
-223 #read_3a = 3rd + random.randint(500,2300) - 4th
[=]5720 #列表中的第 4 个值
就是这样。
当您从列表中的第一个值运行并按照我上面显示的方式生成“读取”的连续值时,您将获得最后一个值,在我们的示例中为第四个值,获得第二和第三值。
现在看看生成的 reads 的最终检查:
check_a = read_1a + read_2a + read_3a
check_b = read_0a + read_1b + read_2b
...您会看到 check_a 中的值总和 = check_b 中的值总和
仅当第一行和最后一行具有相同的值时,上述检查才具有权威性 - 在示例文件中为 57020。
如果第一行和最后一行的值不同,则检查必须是这样的:
first_line_value - last_line_value=(read_0a + read_1b + read_2b) - (read_1a + read_2a + read_3a)。 所以我们可以更恰当地说:
first_line_value - last_line_value = reads_backward 的总和 - reads_onward 的总和
我希望它能帮助您了解必须实现的目标。
并感谢您的耐心等待。
--------------- ------------------------------------------------
eyquem 的脚本真的很棒!
并且完全实现了我对这一刻的指示,但在我的问题结束时,我希望你考虑一些额外的事情,我希望,不需要重写整个代码
1]第一个是输入,“heights.csv”文件。
程序是否有可能接受带有小数点“.”的值
但只是在计算过程中忽略它??
输入 csv 文件将如下所示:
1000,57.020,
2003,56.095,
2007,55.964,
3001,57.020,
但为了计算“读取”,将使用以下整数:57020、56095、55964、57020
2]接下来是自动重新计算能力。
有时,在计算过程中,我们的“读取”显示为带负数的负值,例如:a== [57020, 56095, 55964, 57020]
在这个结果中,我们看到 '-452'
read_a== {1: 1984, 2: 2128, 3: -452}
read_b== {1: 604, 2: 1997, 3: 1059}
在这种情况下,脚本应该重新计算,直到 'reads' 中没有负值
3] 最后是一个输出文件,例如 'output.txt'
是否可以生成包含生成的“读取”的此类文件?
模板如下所示:
[1] # 方括号中的订单号
1= 1000 # 名称取自输入文件的第一列,总是以'1='开头
4=2118 # 生成的'read',总是以'4='开头
[2]
1=2003
4=3043
[3]
1=
4=2054
[4]
1=2007
4=2185
[5]
1= b>
4=2263
[6]
1=3001
4=1207
如您所见,名称取自输入文件的第一列,始终以“1=”开头,必须出现在第一个和最后一个“读取”中,然后仅出现在所有“向后读取”
【问题讨论】:
-
这似乎很随意。了解您要完成的工作可能真的很有帮助。
-
嗯,我尽我所能从这个脚本的内容中理解和概念化它,因为完整的解释会插入不必要的相当复杂的理论,即我国的土地测量程序之一。跨度>
-
你归属于我的剧本是eyquem写的。
-
@daikini 您应该从一开始就明确指出,文件的第一行和最后一行必须具有相同的值。这是 sum(read_a)==sum(read_b) 的必要条件
-
如果我的例子让你误入歧途的话,我当然会这么说。这只是巧合,文件的第一行和最后一行在我的示例中具有相同的值。这不是规则。很抱歉。