Добавление кортежей к спискам, назначение индекса - PullRequest
0 голосов
/ 08 ноября 2011

Я работаю над программой химии, которая требует список всех элементов и соответствующих им единиц атомной массы, что-то вроде:

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)

Я на правильном пути? Если нет, как мне добавить два значения в кортеж, назначить каждое значение и индекс, а затем добавить это в список?

Ответы [ 5 ]

5 голосов
/ 08 ноября 2011

Более простое решение - перебрать файл с помощью цикла for:

elements = []
with open("AtomAMU.txt") as f:
    for line in f:
        name, mass = line.split()
        elements.append((name, int(mass)))
3 голосов
/ 08 ноября 2011

Предполагая, что строки содержат только 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')]

Редактировать: спасибо, Стивен.

1 голос
/ 12 ноября 2011

Ваш класс демонстрирует, что вы новичок в 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

Помните, Atoms является частью экземпляра c из-за последней строки: self.Atoms = Atoms.

1 голос
/ 08 ноября 2011

Словарь был бы лучшей структурой данных.

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
0 голосов
/ 08 ноября 2011

наслаждаться.

elementlist= []
datafile= open("AtomAMU.txt")
for elementdata in datafile:
    elementlist.append(elementdata.split(" "))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...