2011-11-08 3 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) 

正しいトラックにはありますか?いいえの場合は、タプルに2つの値を追加し、各値とインデックスを割り当ててからこれをリストに追加する方法はありますか?

+0

コードを選択して「{}」アイコンをクリックすると、コードを書式設定できます。 – rmmh

+0

タプルは不変です。それらに何かを追加()することはできません。それらのコンテンツを作成するときは、その内容を完全に指定する必要があります。 –

+0

@rmmh固定しました。 Cは普通のテキストとして読むには十分に悪いですが、字下げのないPythonはマゾヒズムです。 – Will

答えて

3

ラインのみC 12などが含まれていると仮定すると、スペースで区切られています。

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

それとも、リストの内包表記を好きに起こる場合:私はあなたが「didnのことを前提としてい

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

注意タプルまたはリストの場合は注意してください。その場合は、キャストしてください:

編集:thanks、Steven。

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

このコードは間違っています。それはまだ改行を含み、リストの項目はリストであり、タプルではありません。 –

+0

@StevenRumbalski:これはなぜ間違っていますか?私は 'readlines'呼び出しを削除する答えを更新しましたが、私の意見ではタプルのキャストと分割作業が必要でしたか? – jro

5

簡単に解決策は、forループを使用してファイルを反復処理することです。

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

私はこのような混乱した気持ちがあります。私はこのような質問をします... Python.orgやGoogleでいくつかのドキュメントを読んで10〜15分で質問に答えました。私はこれがヘルプサイトであることを認識していますが、手始めに少し手間をかけても、最初に質問する必要はなくなりました。私は宿題を嗅ぎます... – Will

+2

@ウィル:この人は、ほとんど働くコードを書こうと努力しています。私はそれらに答えてうれしいです。 –

+1

@StevenRumbalski本当に十分です。私は以前よりも悪化しています。私は、投稿する前に少しでも努力がなされたという気持ちを単純に得る時があると思う。おそらく、私は他人よりも努力していると感じている(私が本当に立ち往生しなければ尋ねないようにしている)ので、私はもっと厳しく判断すべきだ。私が言ったように、そのような記事は私に多種の感情を与える、それだけである。 – Will

0

を楽しむ:

+1

が動作しません... readfileに "AtomAMU.txt"のテキストの最初の行の値が割り当てられ、ファイルが閉じられます。その行のreadline()への呼び出しを破棄すれば動作します。 – Will

+0

woops。 Ivはそれを変更しました。ありがとうbtw。 –

+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に新しいしていることを実証しているので、私はそれをきれいにし、それを完全に書き直すことなくいくつかのことを指摘しようとするでしょう。ここの他のソリューションはより洗練されていますが、うまくいけば、これはあなたがいくつかの概念を理解するのに役立ちます。さて、あなたはchemistryクラスをインスタンス化し、そのreadAMU()メソッドを呼び出すことができます原子番号をロードする際

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 

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

Atomsがあるため、最後の行のcインスタンスの一部であることを覚えておいてください:self.Atoms = Atoms

関連する問題