【问题标题】:Appending tuples to lists, assigning index将元组附加到列表,分配索引
【发布时间】:2011-12-24 16:51:45
【问题描述】:

我正在研究一个化学程序,该程序需要列出所有元素及其对应的原子质量单位,大致如下:

Elements = [(H,1),(He,2)...(C,12)]

所有元素及其 AMU 都是从一个文件中读取的,其中每一行都写成“C 12”。我需要从文件中读取信息,将每一行附加到自己的元组中,然后将元组附加到列表中。这是我尝试过的一些代码,但没有成功。

class chemistry:
    def readAMU():
        infil = open("AtomAMU.txt", "r")
        line = infil.readline()
        Atoms = list()
        Element = ()
        while line !="":
            line = line.rstrip("\n")
            parts = line.split(" ");
            element = parts[0]
            AMU = parts[1]
            element.append(Element)
            AMU.append(Element)
            Element.append(Atoms)

我在正确的轨道上吗?如果不是,我将如何将两个值附加到一个元组中,分配每个值和索引,然后将其附加到一个列表中?

【问题讨论】:

  • 您可以通过选择代码并单击“{ }”图标来格式化代码。
  • 元组是不可变的。你不能append()给他们任何东西,你必须在创建它们时完全指定它们的内容。
  • @rmmh 刚刚解决了这个问题; C 语言已经够糟糕了,无法像普通文本一样阅读,但没有缩进的 Python 是受虐狂。
  • 你真的只是让代码比它需要的复杂得多。您不需要类或定义 - 除非您计划提取更多数据或重用定义。您也不需要创建这么多更小的数组。我建议查看给出的解决方案,并真正尝试了解所做的工作。

标签: python list append tuples


【解决方案1】:

假设这些行仅包含C 12 等,并以空格分隔:

result = []
for line in open('filename.txt'):
    result.append(line.split())

或者如果你碰巧喜欢列表推导:

[l.split() for l in open('filename.txt')]

请注意,我假设您不在乎它是元组还是列表。如果是这样,只需投射它:

[tuple(l.split()) for l in open('filename.txt')]

编辑:谢谢,史蒂文。

【讨论】:

  • 此代码不正确。它仍将包含换行符,并且列表中的项目将是列表,而不是元组。
  • @StevenRumbalski:为什么这是不正确的?我更新了答案以删除 readlines 调用,但我认为元组转换和拆分工作正常吗?
【解决方案2】:

更简单的解决方案是使用 for 循环遍历文件:

elements = []
with open("AtomAMU.txt") as f:
    for line in f:
        name, mass = line.split()
        elements.append((name, int(mass)))

【讨论】:

  • 当我看到这样的问题时,我的心情很复杂......阅读 Python.org 或 Google 上的一些文档需要 10 到 15 分钟才能回答这个问题。我意识到这是一个帮助站点,但事先稍加努力就可以消除首先询问的需要。我闻到家庭作业的味道......
  • @Will:这个人努力编写几乎可以工作的代码。我很高兴回答这些问题。
  • @StevenRumbalski 确实如此;我以前见过比这更糟糕的。我想有时候我只是觉得在发布之前几乎没有做出任何努力。也许我觉得我比其他人付出了更多的努力(除非我真的被卡住了,否则我尽量不问),所以我的判断比我应该的更严厉一些。就像我说的,这样的帖子让我感觉很复杂,仅此而已。
【解决方案3】:

享受。

elementlist= []
datafile= open("AtomAMU.txt")
for elementdata in datafile:
    elementlist.append(elementdata.split(" "))

【讨论】:

  • 不起作用... readfile 被赋值为“AtomAMU.txt”中第一行文本的值,文件被关闭。在该行中删除对 readline() 的调用,它就可以工作了。
  • 哎呀。四改了。谢谢顺便说一句。
  • 没问题;快速将代码组合在一起时容易忽略的东西。
【解决方案4】:

字典会是更好的数据结构。

with open("AtomAMU.txt") as f:
    elements_amu = dict(line.split() for line in f)

像这样使用它:

elements_amu['H']   # gets AMU for H
elements_amu.keys() # list of elements without AMU

【讨论】:

    【解决方案5】:

    您的课程表明您是 Python 新手,因此我将尝试对其进行清理并指出一些事情,而无需完全重写它。这里的其他解决方案更简洁,但希望这会帮助您理解一些概念。

    class chemistry:
        # Because this is a class method, it will automatically
        # receive a reference to the instance when you call the
        # method. You have to account for that when declaring
        # the method, and the standard name for it is `self`
        def readAMU(self):
            infil = open("AtomAMU.txt", "r")
            line = infil.readline()
            Atoms = list()
            # As Frédéric said, tuples are immutable (which means
            # they can't be changed). This means that an empty tuple
            # can never be added to later in the program. Therefore,
            # you can leave the next line out.
            # Element = ()
            while line !="":
                line = line.rstrip("\n")
                parts = line.split(" ");
                element = parts[0]
                AMU = parts[1]
                # The next several lines indicate that you've got the
                # right idea, but you've got the method calls reversed.
                # If this were to work, you would want to reverse which
                # object's `append()` method was getting called.
                # 
                # Original:
                # element.append(Element)
                # AMU.append(Element)
                # Element.append(Atoms)
                # 
                # Correct:
                Element = (element, AMU)
                Atoms.append(Element)
            # If you don't make sure that `Atoms` is a part of `self`,
            # all of the work will disappear at the end of the method
            # and you won't be able to do anything with it later!
            self.Atoms = Atoms
    

    现在,当您想要加载原子序数时,您可以实例化chemistry 类并调用其readAMU() 方法!

    >>> c = chemistry()
    >>> c.readAMU()
    >>> print c.Atoms
    

    请记住,Atomsc 实例的一部分,因为最后一行:self.Atoms = Atoms

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-17
      • 2013-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多