作者wohtp (会喵喵叫的大叔)
看板Python
标题Re: [问题] txt内容切割加总
时间Fri Oct 10 00:37:40 2014
※ 引述《PTT007 (优质单身好男人)》之铭言:
: 如果我有一个txt内容如下:
: 0.01
: 0.02
: 0.03
: 0.09
: 1.03
: 1.02
: 1.01
: 我想将 0.X 和 1.X 各自累加起来
: 输出结果为 0.15 和 3.06
: 我目前的做法是
: number_of_line = len(txt) # txt总共几行
: result = 0
: for i in range(2):
: for j in range(number_of_line):
: if i == int(current_row_value):
: result += current_row_value
: print result
: result = 0
: 但我这样写,资料量多的话就会跑很久
: 请问有其他较好的方法吗
: 谢谢
txt = open("input.txt")
s = txt.readline() # 先读一行进来
result1 = 0 # 一次就可以做完,loop两次干嘛?
result2 = 0
while s != '': # 检查档案尾
if s[0] == '0': # 如果你很确定只有 0 和 1 需要分开的话...
result1 += float(s)
else:
result2 += float(s)
s = txt.readline() # 进下一行
print(result1, result2)
--
你喜欢下列哪一个学妹?
1. 虽然吉他弹得比学姊好,在乐团里却甘愿只当个副手
2. 拥有夏天一到必然黑化的体质,连同学好友都认不出来
3. 虽然嘴巴很严厉,但只要用甜点就可以收买,尤其喜欢鲷鱼烧
4. 讨厌学姊给她取的奇怪绰号,却给小猫取了同一个名字
5. 极力维持自己严肃的形象,但是一戴上猫耳就会不自觉喵喵叫
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 123.110.141.102
※ 文章网址: http://webptt.com/cn.aspx?n=bbs/Python/M.1412872665.A.EF6.html
1F:→ PTT007: 不只0和1,还会有23456...等 10/10 00:45
那就多设几个 result23456...,下面多几个 elif 啊!
不过还有更简单的。
先把上面的 result1, result2 改成
result = [0] * 10
下面的 while loop 改成
while s != ''
result[int(s[0])] += float(s)
s = txt.readline()
唔,这样比原来还更简洁耶。
※ 编辑: wohtp (123.110.141.102), 10/10/2014 00:58:33
※ 编辑: wohtp (123.110.141.102), 10/10/2014 01:00:54
2F:→ PTT007: 可能会有上百个,不可能设这麽多elif吧QQ 10/10 01:16
3F:→ PTT007: 下面那方法我再看一下 感谢~ 10/10 01:20
你只说 0 和 1,我就只分 0 和 1;你只说有23456...,我就只分个位数。
不讲清楚谁知道你需要什麽 -_-
※ 编辑: wohtp (123.110.141.102), 10/10/2014 01:28:17
4F:→ PTT007: 呃 我後面不是有打....吗 就表示那会延伸下去阿 =.= 10/10 01:29
5F:→ PTT007: 另一个方法刚试了OK~感谢您~ 10/10 01:33
6F:→ bigpigbigpig: 那就用 split() 啊,第一个元素当做 dict 的 key 10/10 12:06
7F:推 goodseeyou: 这个方法比较好 10/11 00:57
8F:→ goodseeyou: 虽然需要知道值域范围 跟有可能浪费 memory 但应不是 10/11 01:00
9F:→ goodseeyou: 问题 10/11 01:00
用dict不需要知道值域范围吧,看到几个加几个key进去就是了。
以下是大猪大猪大的建议:
result = {} # 空的 dict
s = txt.readline()
while s != '':
intPart = s.split(',')[0] # 把整数部分拉出来
if intPart in result: # 测看看是否已经有这一项了
result[intPart] += float(s) # 有就直接加在一起
else:
result[intPart] = float(s) # 没有的话要多添这项
s = text.readline()
只有 0 和 1 有只有 0 和 1 的写法,只有个位数有只有个位数的写法,
中间不跳号有中间不跳号的写法,资料有没有排序也当然有差。
现在这个是最一般,什麽(abcd.wxyz)这种形式丢进去都能处理的程式。
可是也必然比较大比较慢。
※ 编辑: wohtp (123.110.141.102), 10/11/2014 01:33:30
※ 编辑: wohtp (123.110.141.102), 10/11/2014 01:33:49
※ 编辑: wohtp (123.110.141.102), 10/11/2014 01:34:54
10F:推 ckclark: split应该是. 另外result = defaultdict(float)更方便 10/11 02:25