对 For/if/else 循环使用列表理解

Using list comprehension for a For/if/else loop

本质上,我编写了一组不同的代码,将给定商店的名称和杂货清单的总价结合在一起,如果它是在那里购买的话。

由于元组仅使用第一个元素进行比较(除非它们相等),我将它们设置为总值在前。

它将遍历 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

这确实不是您在 C 中的做法,也不应该是您在 Python 中的做法。在任何语言中,都有几种方法可以做到这一点;要么你保持一个变量跟踪到目前为止的最高值,并在你看到更高的值时更新它:

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

或者您只需降序排序并取第一个:

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

在 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]