2015-02-08 68 views
0

本質上,我寫了一組不同的代碼,它們將一個給定的商店名稱和一個購物清單的總價格一起調用,如果它在那裏購買的話。對For/if/else循環使用列表理解

由於元組只使用第一個元素進行比較(除非它們相等),所以我設置它們使得總值爲第一個值。

它將遍歷myprices列表長度的索引,它會比較當前元組是否大於下一個元組。

如果它收到一個超出範圍錯誤的索引,它會通過。

我使用單個元組中的[0]和[1]位置來計算程序是否訪問價格或商店名稱。

它會比較元組的價格(自動),然後它會使bestprice =最優惠的價格的商店的名稱。

這實際上是將C編程移植到python中。

我發現pythonic方法來表示單循環,但不是如果/ else語句,而不是兩者的組合。

你有什麼改進建議,或者我可以用python替換的任何範例。

myprices = [(6, shop1), (10, shop2)] 
bestprice = [] 
for i in range(len(myprices)): 
    try: 
     if myprices[i] < myprices[i+1]: 
      bestprice = myprice[i][1] 
     else: 
      bestprice = myprices [i+1][1] 
    except IndexError: 
     pass 

回答

5

慣用的方式找到Python中的集合中的最大值爲max內置功能:

bestprice = max(myprices)[1] # index of 1 to get the shop name 

你的例子真的有沒有使用循環或內涵。我不明白爲什麼你預先分配bestprice是一個空列表,最終你希望它是一個(單個)字符串,而不是一個列表。

如果你真的沒有想要的清單,那麼你可以替換以下循環:

result = [] 
for elem in collection: 
    if cond: 
     result.append(myfunc(elem)) 

下面這個列表理解:

result = [myfunc(elem) for elem in collection if cond] 
+0

不是MAX()在較低級別運行某種類型的循環? – user2208569 2015-02-10 03:32:41

1

這實際上不是你如何在C中完成它,也不應該是你如何在Python中完成它。在任何語言中,有幾種方法可以做到這一點;要麼你把一個變量跟蹤迄今最高,並更新它,每當你看到一個是更高:

highestr = (0,) 
for item in myprices: 
    if item[0] > highest_so_far[0]: 
     highest = item 

,或者你只是降序排列並佔據第一位:

myprices.sort(reverse=True) 
highest = myprices[0]