2011-11-08 41 views
0

我工作的一個化學程序,它要求所有元素的列表以及它們相應的原子質量單位,沿着線的東西:追加元組列表,分配指標

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) 

我在正確的軌道上嗎?如果不是,我將如何將兩個值附加到元組中,分配每個值和索引,然後將其附加到列表中?

+0

您可以通過選擇並單擊「{}」圖標來格式化您的代碼。 – rmmh

+0

元組是不可變的。你不能'追加()'任何東西給他們,你必須在創建它們時完全指定它們的內容。 –

+0

@rmmh只是固定的; C足夠糟糕,不能像常規文本那樣閱讀,但是沒有縮進的Python是受虐狂的。 – Will

回答

3

假設行只包含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')] 

編輯:謝謝,史蒂文。

+0

此代碼不正確。它將仍然包含換行符,列表中的項目將是列表,而不是元組。 –

+0

@StevenRumbalski:爲什麼這不正確?我更新了答案,刪除了'readlines'調用,但是元組的投射和分割工作應該像我認爲的那樣? – jro

5

更簡單的解決辦法就是循環使用for循環的文件:

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

當我看到類似這樣的問題時,我有這種複雜的感受...在Python.org或Google上閱讀一些文檔10-15分鐘就能回答這個問題。我意識到這是一個幫助網站,但事先的一點努力可以消除首先要提問的需要。我聞到家庭作業...... – Will

+2

@威爾:這個人提出了編寫幾乎可行的代碼的努力。我很樂意回答這些問題。 –

+1

@StevenRumbalski不錯,我以前看過比這更糟糕。我想有些時候,我只是覺得在發佈前幾乎沒有做任何努力。也許我覺得我比別人付出了更多的努力(除非我真的陷入困境,否則我會試着不問),所以我比我應該更嚴厲地判斷一下。就像我說的那樣,這些帖子給了我不一樣的感覺,就這些。 – Will

0

享受。

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

不起作用... readfile被分配了「AtomAMU.txt」中第一行文本的值,並且該文件被關閉。將該調用放到該行的readline()中並且它可以工作。 – Will

+0

woops。艾夫改變了它。謝謝btw。 – 2011-11-08 18:25:29

+0

沒問題;快速將代碼拼湊在一起時容易忽略的東西。 – Will

1

字典將是一個更好的數據結構。

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 
1

你的類證明你是新來的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