2017-06-15 58 views
1

多个条件,然后else语句在Python的,如果再else语句,但我有symbolUpper 30个条件:如果我目前做对蟒蛇

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。字典将进一步改进解决方案。 '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分贝。
  • 将您的实际代码移至功能。
  • 把它与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

在这里指定索引是简单的if条件,

i = 2 if symbolUpper == "CAT" else 1 if symbolUpper == "BA" else 0 if symbolUpper == “AXP” 别人假

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

当你有重复,看看有什么相同和不同。

将两者分开。

唯一不同的是索引。 有很多相同的部分。

如果您复制并粘贴了一次或两次以上,则需要重新考虑。正如他们所说,三次罢工和你重构。

您的代码也非常冗长。例如listOfRecords会更好,因为只有records。您也可以直接遍历数据,而不是一个范围和索引遍历到数据:

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

当你打开一个文件,这是最好的事后关闭它。如果您使用with语句,Python将自动为您执行此操作。此外,该模式是r默认情况下,所以你并不需要指定它:

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

你不应该使用eval,真的。例如,如果输入包含删除所有文件的命令,可能会造成严重破坏。如果你拿到面值数字,你可以使用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 

寻址复制和指标的问题。记录包含股票的符号,因此您可以使用记录构建查找表。在Python中的查找表最能代表使用dict

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

旁白:现在我们具有基于DOW符号查找表,我们可以印刷符号时使用它,因为迭代的字典给你钥匙(这是DOW符号):

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)) 

你会称其为:

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

您可以用函数替换你的代码的其余部分

report(lookup[symbol]) 

进一步的改进将包括使用csv模块,为你演绎split(',')手动,它可以为你做的。此外,它正确处理引用的字段,因此如果您的公司名称中有逗号,例如与csv记录

import csv 

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

此外,namedtuple作品起到了很好:谷歌公司,如果它被引述“谷歌,公司” csv将处理它和逗号不裂。

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)