python对象获取完整lis

2024-06-16 10:32:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试编写我的第一个面向对象程序。 我想到的代码是:

    class Lattice:
        'Commomn base for all sublattice'
        latc = 0

        def __init__(self, conc, name, pot):
            self.atcon = atcon
            self.name =name
            self.pot=[]
            Lattice.latc += 1
    atcon=[]
    with open(inpf, "r") as f:
        for line in f:
            match = re.search(reall, line)
            if match:
                if (match.group(1).strip() == "atcon"):
                    atcon.append(match.group(2).split())

print("CON    =>"+str(atcon))
print("CON[0] =>"+str(atcon[0]))
lat0=Lattice(atcon[0],pot[0],name[0])
print("lat0   =>"+str(lat0.atcon))

我原以为lat0.atconatcon[0] 但最后3个打印语句的结果是:

CON    =>[['0.5d0', '0.50d0'], ['0.98d0', '0.02d0'], ['0.98d0', '0.02d0'], ['0.98d0', '0.02d0']]
CON[0] =>['0.5d0', '0.50d0']
lat0   =>[['0.5d0', '0.50d0'], ['0.98d0', '0.02d0'], ['0.98d0', '0.02d0'], ['0.98d0', '0.02d0']]

我不明白为什么。我是一个初学者,没有正式的python培训(学习使用net等),所以,请耐心等待

更新: 在接受答复后,这是我目前正在使用的代码。问题是,我正在读取list中的所有内容,然后将这些列表插入lat0

    #if match found
    atcon.append(match.group(2).split())
# after getting all match, in global scope
lat0=Lattice(atcon[0],name[0],pot[0])

所以,我想我不是在浪费list就是在浪费对象lat0。当找到匹配项时,I是否可能直接填充lat0? e、 g

    #if match found for <name>
    lat0=Lattice(name)

迷你.py:

#!/usr/bin/env python3
import sys
import re


class Lattice:
    'Commomn base for all sublattice'
    latc = 0

    def __init__(self, conc, names, pots):
        self.atcon = conc
        self.name =names
        self.pot=pots
        Lattice.latc += 1

reall='(.*)\s*=\s*(.*)'
inpf = sys.argv[1]
print(inpf)

with open(inpf, "r") as f:
    pot=[]
    name=[]
    atcon=[]
    for line in f:
        match = re.search(reall, line)
        if match:
            if (match.group(1).strip() == "atcon"):
                atcon.append(match.group(2).split())

            if (match.group(1).strip() == "pot"):
                pot.append(match.group(2).split())

            if (match.group(1).strip() == "name"):
                name.append(match.group(2).split())

lat0=Lattice(atcon[0],name[0],pot[0])
print("POT =>"+str(pot))
print("NAME =>"+str(name))
print("CON    =>"+str(atcon))
print("CON[0] =>"+str(atcon[0]))
print("lat0   =>"+str(lat0.pot))

典型输入

   pot=Rh1.pot Rh2.pot Fe1a.pot Fe2a.pot 
   name=Rh-up Fe-up
   atcon=0.5d0 0.50d0 

   pot=Rh3.pot  Rh4.pot Fe3a.pot Fe4a.pot
   name=Rh-up Fe-up
   atcon=0.98d0 0.02d0

Tags: nameselfforifmatchgroupconprint
1条回答
网友
1楼 · 发布于 2024-06-16 10:32:19

我打赌你不是在空闲的时候写的就是测试的。在这一点上,我敢肯定这是非常混乱,但错误是非常简单的。实例化类时,通常建议使用发送给__init__的值,而不要引用其他值

class Lattice:
    'Commomn base for all sublattice'
    latc = 0

    def __init__(self, conc, name, pot):
        self.atcon = conc
        self.name =name
        self.pot=pot
        Lattice.latc += 1

所发生的情况是atconponname在全局范围内定义,您在下面的示例中引用了它们:

atcon=[1, 2, 3, 4, 5, 6]
pot = [7,8,9]
name = ["foo", "bar"]

class globs:
    def __init__(self):
        self.atcon = atcon
        self.pot = pot
        self.name = name

其输出如下:

>>> g = globs()
>>> g.atcon
[1, 2, 3, 4, 5, 6]
>>> g.pot
[7, 8, 9]
>>> g.name
['foo', 'bar']

编辑回答原问题的扩展编辑

我想我明白了。有两件事仍然困扰着我:

  • 如果我按照代码来做,看起来你只想在文件中找到第一个匹配的lat0。但是您还没有解释是否只需要文件中的第一个命中,或者所有命中对象的列表
  • 你做了一个分割,但是根据你的样本输入,仍然会返回一个列表,即["Rh1.pot", "Rh2.pot", "Fe1a.pot", "Fe2a.pot"],我可能很冒昧,但是我在分割后添加了一个[0],只检索第一次点击。如果我没抓住重点就把它去掉

以下代码将在找到第一次命中后停止循环。我声明atconpotname为列表,因为.split()将返回一个列表,但我不会附加结果,以免浪费内存。我还使用return Lattice对象退出函数,避免在解析其余行时浪费时间

另外,最后的if atcon and pot and name是为了避免在有匹配的文本但不包含所有重要信息的情况下返回。在python中,if的空列表将是False。您可以保留代码的其余部分(print语句除外)

inpf = sys.argv[1]
print(inpf)

def parse(inpf):
    atcon, pot, name = [], [], []
    reall='(.*)\s*=\s*(.*)'
    with open(inpf, "r") as f:
        for line in f:
            print(line)
            if match:            
                if (match.group(1).strip() == "atcon"):
                    atcon = match.group(2).split()[0]

                if (match.group(1).strip() == "pot"):
                    pot = match.group(2).split()[0]

                if (match.group(1).strip() == "name"):
                    name = match.group(2).split()[0]

                if atcon and pot and name:
                    return Lattice(atcon, name, pot)

lat0 = parse("test.txt")
print("lat0   =>"+str(lat0.pot)+" "+str(lat0.name)+" "+str(lat0.atcon))

测试日期

atcon=0.5d0 0.50d0
atcon=0.5d0 0.50d0 
atcon=0.5d0 0.50d0 

pot=Rh1.pot Rh2.pot Fe1a.pot Fe2a.pot 
name=Rh-up Fe-up
atcon=0.5d0 0.50d0 

pot=Rh3.pot  Rh4.pot Fe3a.pot Fe4a.pot
name=Rh-up Fe-up
atcon=0.98d0 0.02d0

输出:

lat0   =>Rh1.pot Rh-up 0.5d0

相关问题 更多 >