【问题标题】:List comprehension with a exit once value found [duplicate]找到值后退出列表理解[重复]
【发布时间】:2020-10-23 15:38:22
【问题描述】:

我现在正在学习列表推导,并且想用优雅的列表推导替换冗长的 if 语句。下面的 if 语句是我想要转换为它下面的理解列表的内容。理解列表还没有做我想做的事情,但至少你可以看到我想用它去哪里。

希望列表推导式只返回一个值,就像 if 语句一样。

提前谢谢你

weight_kg = 8

if weight_kg <= 0.25:
    price_weight = 2.18
elif weight_kg <= 0.5:
    price_weight = 2.32
elif weight_kg <= 1:
    price_weight = 2.49
elif weight_kg <= 1.5:
    price_weight = 2.65
elif weight_kg <= 2:
    price_weight = 2.90
elif weight_kg <= 3:
    price_weight = 4.14
elif weight_kg <= 4:
    price_weight = 4.53
elif weight_kg <= 5:
    price_weight = 4.62
elif weight_kg <= 6:
    price_weight = 5.28
elif weight_kg <= 7:
    price_weight = 5.28
elif weight_kg <= 8:
    price_weight = 5.42
elif weight_kg <= 9:
    price_weight = 5.42
elif weight_kg <= 10:
    price_weight = 5.42
elif weight_kg <= 11:
    price_weight = 5.43 
else:
    price_weight = 5.63

print(price_weight)




shipping_price = [{"weight": 0.25, "price" : 2.18}, {"weight": 0.5 "price" : 2.32}, {"weight": 1 "price" : 2.49}]

toy_weight = 0.6

price = [ship_price["weight"] for ship_price in shipping_price if ship_price["weight"] <= toy_weight]
print(price)

【问题讨论】:

  • 有计算price_weight的公式吗?
  • 也许在这里找到一些想法:stackoverflow.com/questions/61030617/…
  • 在为玩具定义价格重量后,该值用于计算运费/价格等级。那是一个后期阶段,现在我正试图弄清楚如何更优雅地执行 if 语句/选择正确的价格层。
  • @Jeffrey 您确定与使用bisect 相关联的第一个答案@schwobaseggl 没有回答您的问题吗?看起来很吸引我

标签: python list if-statement list-comprehension


【解决方案1】:

由于您只需要生成器表达式的第一个值,因此根本不需要列表。只需使用next 拉取第一个值:

>>> shipping_price = [
...     {"weight": 0.25, "price" : 2.18},
...     {"weight": 0.5, "price" : 2.32},
...     {"weight": 1, "price" : 2.49}
... ]
>>> toy_weight = 0.6
>>> next(sp["price"] for sp in shipping_price if sp["weight"] >= toy_weight)
2.49

我会为此使用元组而不是字典。可能NamedTuples 如果您有很多字段并想给它们命名,但对于两个值,我只使用这样的普通旧元组:

>>> weights_and_prices = [(0.25, 2.18), (0.5, 2.32), (1, 2.49)]
>>> toy_weight = 0.6
>>> next(wp[1] for wp in weights_and_prices if wp[0] >= toy_weight)
2.49

根据需要扩展weights_and_prices 元组列表(即使用原始if/elif 链中的所有剩余重量/价格值)。

【讨论】:

  • 重量为 0.6 的商品不应该定价为 2.49,而不是 2.18?
  • 我猜;我只是关闭他们的示例代码并将其缩减。翻转比较器使其按照您描述的方式工作。 :)
  • @Samwise 这根本没有回答问题。 OP 希望消除 if 语句块。
  • 它们被生成器所取代。 OP的问题措辞令人困惑;代码的第二部分是他们尝试对数据子集执行此操作。我只是扩展了他们代码的那一部分,以使其完成他们的要求。不需要从代码的第一部分复制和粘贴所有值来演示该概念。 :)
  • 只是为了澄清。我用 if 语句代码正确地做到了,但如果可能的话,我想用更干净的代码替换它。它更多地是关于如何更好地解决问题的想法,而不是那里的价值观。
猜你喜欢
  • 2021-10-16
  • 1970-01-01
  • 1970-01-01
  • 2016-04-06
  • 2020-07-19
  • 2011-06-15
  • 2019-08-13
  • 1970-01-01
  • 2016-10-20
相关资源
最近更新 更多