1

現在、CSVファイルは次のように設定されています。

Element,Weight
"Hydrogen","1"
"Oxygen","16"

最終的には、すべての元素とその原子質量が隣に表示されますが、この問題を最初に解決しない限り、すべてを入れることは無意味です。

主なPythonプログラムは次のとおりです。

import csv
reader = csv.reader(open("chem.csv", "rb"))

first = raw_input("Enter first element: ")
second = raw_input("Enter second element: ")

if first == "Hydrogen" or "hydrogen":
     for Weight in reader:
        print Weight

else:
     print "No."

さて、それからわか​​るかもしれませんが、ここでの私の目的は、今のところ、CSVファイルから取得した水素の重量をプログラムに表示させることです。ただし、現在は次のように表示されます。

Enter first element: hydrogen
Enter second element: oxygen
['Element', 'Weight']
['Hydrogen', '1']
['Oxygen', '16']

それで、基本的に、それが水素の行に行き、次に2番目の列から重み値を取得するようにするにはどうすればよいですか?そこからプログラムの残りの部分を釘付けにすることができるはずですが、この部分は私を立ち往生させています。

二次的なこととして、メインのPythonプログラムとCSVファイルの要素の本質的なリストを持っている必要がないようにそれを持っていることはまったく可能ですか?それは混乱を大幅に削減するでしょうが、私はそれを理解することができません。

4

3 に答える 3

3

データを反復処理する代わりに、名前を重みにマッピングする辞書など、簡単にアクセスできる方法でデータを保存する方がおそらく良いでしょう。次に、入力された文字列を検索して結果を表示できます(存在しない場合は表示されません)。

import csv

#Read in data anbd store it in dictionary.
#The element name will be stored in lowercase.
elemen_data = { element.lower():int(weight) for element,weight in csv.reader(open("in", "rb"))}

first = raw_input("Enter first element: ")
second = raw_input("Enter second element: ")

#Look for the weight of the entered element (after converting it to all lowercase)
weight_first = elemen_data.get(first.lower())
weight_second = elemen_data.get(second.lower())

if weight_first is not None:
    print 'First Element:', first, 'Weight:', weight_first
else:
    print 'First Element', first, 'not found'

if weight_second is not None:
    print 'Second Element:', second, 'Weight:', weight_first
else:
    print 'Second Element', second, 'not found'

プログラムに触れずにデータを簡単に変更できるようにしたい場合は、プログラムロジックとは別にデータを保存することをお勧めします。したがって、読み込まれるcsvファイルがあることは絶対に問題ありません。(データが妥当なサイズである限り)

于 2012-08-08T19:13:30.323 に答える
1

問題は、csv.readerオブジェクトを反復処理すると、行セル値のリストとしてcsvファイルの行を受け取ることです。だからあなたはあなたのケースのために次に試すことができます:

if first in ("Hydrogen", "hydrogen"):
     for Weight in reader:
        if Weight[0] == first:
            print Weight[1]

これは最良のコードではありませんが、必要な値を返します。

于 2012-08-08T19:07:54.320 に答える
0

最初の問題:

if first == "Hydrogen" or "hydrogen":

それはあなたが望むものを返しません。あなたはどちらかが欲しい:

if first == 'Hydrogen' or first == 'hydrogen':

また

if first in ['Hydrogen', 'hydrogen']:

またはさらに良い:

if first.lower() == 'hydrogen'

これは、HYDrogenのようなすべての大文字化で機能します。

次に、あなたが望むことをすることができるという点で:

for row in reader:
    if row[0].lower() == first.lower():
        print row[1]

もちろん、これは値の辞書を使用することで少しクリーンアップできます。おそらくifすべての要素のステートメントは必要ありませんが、そこに行きます。

于 2012-08-08T19:14:38.683 に答える