2017-06-15 7 views
1

に、私は現在、Pythonであれば、else文をやっているが、私はsymbolUpperのための30個の条件がある場合:その後、複数の条件のためelse文のpython

if symbolUpper == "CAT": 
    growth = (((listOfRecords[2][5]-listOfRecords[2][4])/listOfRecords[2][4])*100) 
    peRatio = (listOfRecords[2][5]/listOfRecords[2][6]) 
    print("Company: " + listOfRecords[2][0]) 
    print("Industry: " + listOfRecords[2][3]) 
    print("Exchange: " + listOfRecords[2][2]) 
    print("Growth in 2013: {0:,.2f}%".format(growth)) 
    print("Price/Earning ratio in 2013: {0:,.2f}".format(peRatio)) 

は上場せずにpythonでコーディングする簡単な方法はありますすべての30の条件?私は全体のコードも含めました。

infile = open("Dow.txt", 'r') 
listOfRecords = [line.rstrip() for line in infile] 
infile.close() 
for i in range(len(listOfRecords)): 
    listOfRecords[i]=listOfRecords[i].split(",") 
    listOfRecords[i][4] = eval(listOfRecords[i][4])  # price at the end of trading on 12/31/2012 
    listOfRecords[i][5] = eval(listOfRecords[i][5])  # price at the end of trading on 12/31/2013 
    listOfRecords[i][6] = eval(listOfRecords[i][6])  # 2013 earnings per share 

print("Symbols for the Thirty DOW Stocks") 
print(listOfRecords[0][1] + "\t" + listOfRecords[1][1] + "\t" + 
     listOfRecords[2][1] + "\t" + listOfRecords[3][1] + "\t" + 
     listOfRecords[4][1] + "\t" + listOfRecords[5][1] + "\t" + 
     listOfRecords[6][1] + "\t" + listOfRecords[7][1] + "\t" + 
     listOfRecords[8][1] + "\t" + listOfRecords[9][1] + "\n" + 
     listOfRecords[10][1] + "\t" + listOfRecords[11][1] + "\t" + 
     listOfRecords[12][1] + "\t" + listOfRecords[13][1] + "\t" + 
     listOfRecords[14][1] + "\t" + listOfRecords[15][1] + "\t" + 
     listOfRecords[16][1] + "\t" + listOfRecords[17][1] + "\t" + 
     listOfRecords[18][1] + "\t" + listOfRecords[19][1] + "\n" + 
     listOfRecords[20][1] + "\t" + listOfRecords[21][1] + "\t" + 
     listOfRecords[22][1] + "\t" + listOfRecords[23][1] + "\t" + 
     listOfRecords[24][1] + "\t" + listOfRecords[25][1] + "\t" + 
     listOfRecords[26][1] + "\t" + listOfRecords[27][1] + "\t" + 
     listOfRecords[28][1] + "\t" + listOfRecords[29][1] + "\t") 
print() 
symbol = input("Enter a symbol: ") 
symbolUpper = symbol.upper() 

if symbolUpper == "AXP": 
    growth = (((listOfRecords[0][5]-listOfRecords[0][4])/listOfRecords[0][4])*100) 
    peRatio = (listOfRecords[0][5]/listOfRecords[0][6]) 
    print("Company: " + listOfRecords[0][0]) 
    print("Industry: " + listOfRecords[0][3]) 
    print("Exchange: " + listOfRecords[0][2]) 
    print("Growth in 2013: {0:,.2f}%".format(growth)) 
    print("Price/Earning ratio in 2013: {0:,.2f}".format(peRatio)) 

if symbolUpper == "BA": 
    growth = (((listOfRecords[1][5]-listOfRecords[1][4])/listOfRecords[1][4])*100) 
    peRatio = (listOfRecords[1][5]/listOfRecords[1][6]) 
    print("Company: " + listOfRecords[1][0]) 
    print("Industry: " + listOfRecords[1][3]) 
    print("Exchange: " + listOfRecords[1][2]) 
    print("Growth in 2013: {0:,.2f}%".format(growth)) 
    print("Price/Earning ratio in 2013: {0:,.2f}".format(peRatio)) 

if symbolUpper == "CAT": 
    growth = (((listOfRecords[2][5]-listOfRecords[2][4])/listOfRecords[2][4])*100) 
    peRatio = (listOfRecords[2][5]/listOfRecords[2][6]) 
    print("Company: " + listOfRecords[2][0]) 
    print("Industry: " + listOfRecords[2][3]) 
    print("Exchange: " + listOfRecords[2][2]) 
    print("Growth in 2013: {0:,.2f}%".format(growth)) 
    print("Price/Earning ratio in 2013: {0:,.2f}".format(peRatio)) 

if symbolUpper == "CSCO": 
    growth = (((listOfRecords[3][5]-listOfRecords[3][4])/listOfRecords[3][4])*100) 
    peRatio = (listOfRecords[3][5]/listOfRecords[3][6]) 
    print("Company: " + listOfRecords[3][0]) 
    print("Industry: " + listOfRecords[3][3]) 
    print("Exchange: " + listOfRecords[3][2]) 
    print("Growth in 2013: {0:,.2f}%".format(growth)) 
    print("Price/Earning ratio in 2013: {0:,.2f}".format(peRatio)) 

答えて

1

はい。がある。 dict使用して、シンボルのルックアップを維持:

lookup_dict = {'AXP': 0, 'BA': 1, ...} 
try: 
    i = lookup_dict[symbolUpper] 
    growth = (((listOfRecords[i][5]-listOfRecords[i][4])/listOfRecords[i][4])*100) 
    peRatio = (listOfRecords[i][5]/listOfRecords[i][6]) 
    print("Company: " + listOfRecords[i][0]) 
    print("Industry: " + listOfRecords[i][3]) 
    print("Exchange: " + listOfRecords[i][2]) 
    print("Growth in 2013: {0:,.2f}%".format(growth)) 
    print("Price/Earning ratio in 2013: {0:,.2f}".format(peRatio)) 
except KeyError: 
    ... # symbolUpper not in dict 
+1

なぜ「dict」を使用しないのですか? –

+1

私は@ PeterWoodに同意します。 dictはソリューションをさらに改善します。 'lookup_dict = {'AXP':0、 'BA':1、...}'そして 'lookup_dict [symbolUpper]'を使って 'i'を取得してください。 – MrLeeh

+0

良いアイデア。それを考えなかった。みんなありがとう。 –

0

保存リストにあなたはとの比較をしたいすべての文字列を、あなたがしたい文字列のインデックスを取得し、そのインデックスを使用してタスクを実行します。

symbolUpperList = ["AXP", "BA", "CAT", ...] 

i = symbolUpperList.index(symbolUpper) 
growth = (((listOfRecords[i][5]-listOfRecords[i][4])/listOfRecords[i][4])*100) 
peRatio = (listOfRecords[i][5]/listOfRecords[i][6]) 
print("Company: " + listOfRecords[i][0]) 
print("Industry: " + listOfRecords[i][3]) 
print("Exchange: " + listOfRecords[i][2]) 
print("Growth in 2013: {0:,.2f}%".format(growth)) 
print("Price/Earning ratio in 2013: {0:,.2f}".format(peRatio)) 
0
  • キーと値を使用してsymbolUpper DBを準備します。
  • 実際のコードを機能させるように移動します。
  • 次のようにコードをすることができ

symbolUpperのidとそれを呼び出す:

infile = open("Dow.txt", 'r') 
listOfRecords = [line.rstrip() for line in infile] 

symbolUpper_db = {"AXP": 1, "BA" : 2, "CAT":3, "CSCO":4 } 

def compute(symbol_idx): 
    growth = (((listOfRecords[symbol_idx][5]-listOfRecords[symbol_idx][4])/listOfRecords[symbol_idx][4])*100) 
    peRatio = (listOfRecords[symbol_idx][5]/listOfRecords[symbol_idx][6]) 
    print("Company: " + listOfRecords[symbol_idx][0]) 
    print("Industry: " + listOfRecords[symbol_idx][3]) 
    print("Exchange: " + listOfRecords[symbol_idx][2]) 
    print("Growth in 2013: {0:,.2f}%".format(growth)) 
    print("Price/Earning ratio in 2013: {0:,.2f}".format(peRatio)) 

compute(symbolUpper_db[symbolUpper]) 
0

あなただけのindexの変化を持っています。だからここにあなたのsymbolUpper

ごとにインデックスを指定することは

i = 2 if symbolUpper == "CAT" else 1 if symbolUpper == "BA" else 0 if symbolUpper == "AXP"、それ以外の場合はfalse状態であれば簡単です

if i: 
    growth = (((listOfRecords[i][5]-listOfRecords[i][4])/listOfRecords[i][4])*100) 
    peRatio = (listOfRecords[i][5]/listOfRecords[i][6]) 
    print("Company: " + listOfRecords[i][0]) 
    print("Industry: " + listOfRecords[i][3]) 
    print("Exchange: " + listOfRecords[i][2]) 
    print("Growth in 2013: {0:,.2f}%".format(growth)) 
    print("Price/Earning ratio in 2013: {0:,.2f}".format(peRatio)) 

たり、辞書検索を使用して試すことができ、

sym = {"AXP": 1, "BA" : 2, "CAT":3, "CSCO":4 } 
growth = (((listOfRecords[sym[symbolUpper]][5]-listOfRecords[sym[symbolUpper]][4])/listOfRecords[sym[symbolUpper]][4])*100) 
peRatio = (listOfRecords[sym[symbolUpper]][5]/listOfRecords[sym[symbolUpper]][6]) 
print("Company: " + listOfRecords[sym[symbolUpper]][0]) 
print("Industry: " + listOfRecords[sym[symbolUpper]][3]) 
print("Exchange: " + listOfRecords[sym[symbolUpper]][2]) 
print("Growth in 2013: {0:,.2f}%".format(growth)) 
print("Price/Earning ratio in 2013: {0:,.2f}".format(peRatio)) 
1

重複がある場合は、同じものが何であるかを見てください。

2つを区切ります。

唯一の違いはインデックスです。 同じ部分がたくさんあります。

複数回コピーして貼り付けた場合は、もう一度考え直す必要があります。彼らが言うように、3つのストライクとあなたはリファクタリングします。

あなたのコードも非常に冗長です。例えば、listOfRecordsは、ちょうどrecordsとして良いでしょう。また、データの代わりに、データに範囲とインデックスを反復処理の真上に繰り返すことができます:

print("Symbols for the Thirty DOW Stocks") 
print('\t'.join(record[1] for record in records) 

ファイルを開くと、それは後でそれを閉じることをお勧めします。 withステートメントを使用すると、Pythonは自動的にこれを行います。あなたは本当に、evalを使うべきではありません

with open("Dow.txt") as infile: 
    records = [line.rstrip() for line in infile] 
# file will be closed here 

:あなたはそれを指定する必要はありませんので、また、モードはデフォルトでrです。たとえば、入力にすべてのファイルを削除するコマンドが含まれていた場合、混乱を招く可能性があります。あなただけの文字通りの数字を持っていれば、あなたは安全にliteral_evalを使用することができます。

from ast import literal_eval 

records = [records.split(',') for record in records] 
for record in records: 
    record[4] = literal_eval(record[4]) # price at the end of trading on 12/31/2012 
    record[5] = literal_eval(record[5]) # price at the end of trading on 12/31/2013 
    record[6] = literal_eval(record[6]) # 2013 earnings per share 

重複やインデックスの問題に対処します。レコードには在庫のシンボルが含まれているため、レコードを使用してルックアップテーブルを作成できます。別に

lookup = {record[1]: record 
      for record in records} 

:Pythonでは、ルックアップテーブルは最高dictを使用して表現された今、私たちはDOWのシンボルに基づいて、ルックアップテーブルを持つシンボルを印刷するときに辞書を反復することは、あなたにキーを与えるように、我々は(それを使用することができます)DOW記号たです:

print("Symbols for the Thirty DOW Stocks") 
print('\t'.join(symbol for symbol in records) 

あなたが機能を使用して、コードの残りの部分を置き換えることができます。

def report(dow): 
    growth = 100 * (dow[5] - dow[4])/dow[4] 
    peRatio = dow[5]/dow[6] 
    print("Company: " + dow[0]) 
    print("Industry: " + dow[3]) 
    print("Exchange: " + dow[2]) 
    print("Growth in 2013: {0:,.2f}%".format(growth)) 
    print("Price/Earning ratio in 2013: {0:,.2f}".format(peRatio)) 

あなたのようにそれを呼び出します。

report(lookup[symbol]) 

さらなる改善は、手動split(',')を実行するよう、それはあなたのためにそれを行うことができ、csvモジュールを使用して含まれるであろう。また、引用されたフィールドも適切に処理されるため、会社名にコンマが含まれているとします(例:グーグル株式会社、それは「グーグル株式会社」csvはカンマで分割、それを処理しないので、引用された場合:

import csv 

with open("Dow.txt") as infile: 
    records = list(csv.reader(infile)) 

また、csv記録とうまく動作namedtuple

Dow = namedtuple('Dow', 'company symbol exchange industry previous price earning') 

records = [Dow(*[literal_eval(value) for value in record]) 
      for record in records] 

次に、あなたの計算では、読みやすいことができます:

growth = 100 * (dow.price - dow.previous)/dow.previous 
pe_ratio = dow.price/dow.earning 

あなたはどこか別の場所にそれを使用したい場合があります最後に、あなたのレポートは、例えば、printから分離されなければなりませんロギング、ファイルへの書き込みなどがあります。フォーマットフィールドを使用すると、読みやすくなります。

report_format = ('Company: {dow.company}\n' 
       'Industry: {dow.industry}\n' 
       'Exchange: {dow.exchange}\n' 
       'Growth in 2013: {growth:,.2f}%\n' 
       'Price/Earning ratio in [email protected] {pe_ratio:,.2f}\n') 

report = report_format.format(dow=record, 
           growth=growth, 
           pe_ratio=pe_ratio) 

print(report)