对For / if / else循环使用列表推导

时间:2015-02-08 23:12:40

标签: python list-comprehension

基本上,我写了一组不同的代码,这些代码将给定商店的名称和购物清单的总价(如果是在那里购买的话)一起调用。

由于元组仅使用第一个元素进行比较(除非它们相等)我已经设置它们以使总值成为第一个。

它将循环遍历myprices列表长度的索引,并将比较当前元组是否大于下一个元组。

如果它收到索引超出范围错误,它将通过。

我使用单个元组中的[0]和[1]位置来命名该程序是否正在访问商店的价格或名称。

它将比较元组的价格(自动),然后它将使bestprice =具有最佳价格的商店的名称。

这实际上是C编程被移植到python中。

我发现pythonic方式表达单个循环,但不是if / 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

2 个答案:

答案 0 :(得分: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]

答案 1 :(得分: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]