24小时热门版块排行榜    

查看: 441  |  回复: 2

lemon4113

捐助贵宾 (初入文坛)

[求助] 循环读取文本并赋值给二维列表,出错 已有1人参与

虽然有现成的bandplot.pl,但还写了个从vasp的OUTCAR给出能带的python,这是其中一部分,希望查找“occupation”,并将其随后的第2到13行中的数据的第二列付给x[k,b],经测试发现,在b循环内x[k,b]正常,但是循环结束后,所有的x[k]都变成了x[100],(如x[k]和x[k-1]的值都是x[100],共101个K点),不知道是哪里的问题。(另,若将k循环改为rang(101),也会出错,)请指教。(由于显示问题x[k,b]表示x【k】【b】)
#!/usr/bin/python
import sys
f = open("OUTCAR"
lines=f.readlines()
l=len(lines)
i= 0
j= 0
E= 0
x=[[0,]*12]*101
k=-1
while  i< l:
    if 'occupation' in lines:
        k+=1
        for b in range(12):
            j=i+b+1
            x[k,b]=lines[j].split()[1]
        i+=15
        print x[k-1]
        print x[k]
    else:
        i+=1
回复此楼

» 猜你喜欢

vasp薄膜
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

virtualzx

木虫 (著名写手)

【答案】应助回帖

★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★
感谢参与,应助指数 +1
lemon4113: 金币+20, ★★★很有帮助, 非常好 2016-06-28 09:14:33
这一行有问题
x=[[0,]*12]*101

你看一下mutable和immutable object的概念。总的来说,你这里定义的根本不是二维数组。x是同一个列表重复101次。因此赋值时所有行都同时变。它们永远都是一样的。

python的list其实是小的子列表的双链表,它可以随意延长,速度不受影响。另外它相当于是一个指针列表,不是数组。没有必要提前分配空间指定大小,只要x=[], 然后用append来增加元素就可以了。

如果非要分配空间,可以用list comprehension
x = [0 for  i in xrange(101) for j in xrange(12)]

你还有很多用法不大合适的,比如打开文件最好用with结构,读取文件最好不要一下全部读入内存。
2楼2016-06-27 23:02:16
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

lemon4113

捐助贵宾 (初入文坛)

引用回帖:
2楼: Originally posted by virtualzx at 2016-06-27 23:02:16
这一行有问题
x=*101

你看一下mutable和immutable object的概念。总的来说,你这里定义的根本不是二维数组。x是同一个列表重复101次。因此赋值时所有行都同时变。它们永远都是一样的。

python的list其实是小 ...

谢谢virtualzx的回复,指出了我的错误,并给出响应建议,同时还使我了解了一些对我而言的新东西,受教了。正在尝试修改。
vasp薄膜
3楼2016-06-28 09:14:26
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 lemon4113 的主题更新
信息提示
请填处理意见