鱼C论坛

 找回密码
 立即注册
查看: 2977|回复: 11

程序报错,不清楚原因~

[复制链接]
发表于 2014-7-21 18:06:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. import re
  2. f = open('test.txt')
  3. list1 = []
  4. list2 = [[]]
  5. count = 0
  6. for line in f.readlines():
  7.     line = line.strip('\n')
  8.     fields = line.split('|')
  9.     list2[count].append(fields[1])
  10.     if fields[0] not in list1:
  11.         list1.append(fields[0])
  12.         count += 1
  13. for i in range(count):
  14.     print(list1[i])
  15. f.close()
复制代码

test.txt文件内容:
O|0,
A|1,
A|2,
A|3,
C|4,
B|5,
B|6,
D|7,


报错如下:
Traceback (most recent call last):
  File "C:\Python34\MyPython\test.py", line 9, in <module>
    list2[int(count)].append(fields[1])
IndexError: list index out of range



为什么会这样呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-7-21 18:25:20 | 显示全部楼层
本帖最后由 swl19880916 于 2014-7-21 18:34 编辑
  1. import re

  2. f = open('test.txt')

  3. list1 = []

  4. list2 = [[]]

  5. count = 0

  6. for line in f.readlines():

  7.     line = line.strip('\n')

  8.     fields = line.split('|')

  9.     list2.append(fields[1])#把[count]去掉就行了,因为你指定了列表中的一个元素,是不能增加最大值的,谢谢楼主,让我涨了点知识。

  10.     if fields[0] not in list1:

  11.         list1.append(fields[0])

  12.         count += 1

  13. for i in range(count):

  14.     print(list1[i])

  15. f.close()
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-21 18:54:14 | 显示全部楼层

感谢回复,可能你不明白我的初衷,我的目的是生成这样一个列表:
[[0], [1,2,3], [4], [5,6], [7]]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-21 21:39:24 | 显示全部楼层
本帖最后由 昨、夜星辰 于 2014-7-21 21:43 编辑

我想我这个程序报错的原因大概就是超出了列表长度吧,貌似python不支持定义未知长度的二维列表,所以我只好放弃这种做法了~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-21 21:50:25 | 显示全部楼层
奉上我修改后的代码及目的:

目的是做文本处理,将下面的原文本转化为目标文本:
  1. 原文本:
  2. O|0,
  3. A|1,
  4. A|2,
  5. A|3,
  6. C|4,
  7. B|5,
  8. B|6,
  9. D|7,

  10. 目标文本:
  11. O|0,
  12. A|1,2,3,
  13. C|4,
  14. B|5,6,
  15. D|7,
复制代码


代码如下:
  1. file = open('test.txt')
  2. dicts = {}
  3. lists = []
  4. for line in file.readlines():
  5.     line = line.strip('\n')
  6.     fields = line.split('|')
  7.     if fields[0] not in lists:
  8.         lists.append(fields[0])
  9.         dicts[fields[0]] = fields[1]
  10.         continue
  11.     dicts[fields[0]] += fields[1]
  12. for i in lists:
  13.     print(i + '|' + dicts[i])
  14. file.close()
复制代码


希望高手们有更好的脚本请不吝赐教!小弟刚学python,希望能得到高手们的指点~

点评

既然你已经实现了使用字典的形式(对于少量数据,使用字典比较消耗内存),我就用两个列表实现啦:  详情 回复 发表于 2014-7-23 16:50
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-7-21 22:02:06 | 显示全部楼层
好厲害呀, 慚愧中....
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-7-22 11:34:35 | 显示全部楼层
昨、夜星辰 发表于 2014-7-21 18:54
感谢回复,可能你不明白我的初衷,我的目的是生成这样一个列表:
[[0], [1,2,3], [4], [5,6], [7]]

是滴,我是新手,只能回答这些。真不好意思~!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-22 11:54:30 | 显示全部楼层
swl19880916 发表于 2014-7-22 11:34
是滴,我是新手,只能回答这些。真不好意思~!

我也只是个新手而已,大家互相学习~:handshake
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-7-23 16:50:26 | 显示全部楼层
昨、夜星辰 发表于 2014-7-21 21:50
奉上我修改后的代码及目的:

目的是做文本处理,将下面的原文本转化为目标文本:

既然你已经实现了使用字典的形式(对于少量数据,使用字典比较消耗内存),我就用两个列表实现啦:

  1. f = open('test.txt')
  2. list1 = []
  3. list2 = []

  4. for line in f.readlines():
  5.     line = line.strip('\n')
  6.     fields = line.split('|')
  7.     if fields[0] not in list1:
  8.         list1.append(fields[0])
  9.         list2.append(list(fields[1]))
  10.     else:
  11.         list2[list1.index(fields[0])].append(fields[1])

  12. length = len(list1)
  13. for i in range(length):
  14.     print(list1[i] + '|', end='')
  15.     for j in list2[i]:
  16.         print(j, end='')
  17.     print()
  18.    
  19. f.close()
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-23 17:43:55 | 显示全部楼层
小甲鱼 发表于 2014-7-23 16:50
既然你已经实现了使用字典的形式(对于少量数据,使用字典比较消耗内存),我就用两个列表实现啦:

感谢小甲鱼老师!

从你的代码我学习到了创建二维列表的方法,另外,我有个小建议:
  1.     print(list1[i] + '|', end='')
  2.     for j in list2[i]:
  3.         print(j, end='')
  4.     print()
复制代码

上面这四行可以替换成下面这一行:
  1. print(list1[i] + '|' + ''.join(list2[i]))
复制代码


最后,有一个问题想请教,你说:
对于少量数据,使用字典比较消耗内存

这是什么原理呢?

点评

字典采用的是哈希的方法,必须为此准备一块连续的内存空间,请查看:http://bbs.fishc.com/thread-45016-1-1.html  详情 回复 发表于 2014-7-23 18:14
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-7-23 18:14:55 | 显示全部楼层
昨、夜星辰 发表于 2014-7-23 17:43
感谢小甲鱼老师!

从你的代码我学习到了创建二维列表的方法,另外,我有个小建议:

字典采用的是哈希的方法,必须为此准备一块连续的内存空间,请查看:http://bbs.fishc.com/thread-45016-1-1.html
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-23 19:04:30 | 显示全部楼层
小甲鱼 发表于 2014-7-23 18:14
字典采用的是哈希的方法,必须为此准备一块连续的内存空间,请查看:http://bbs.fishc.com/thread-45016- ...

明白了,谢谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-24 21:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表