【问题标题】:Python: Multiple if conditions depending on parameterPython:多个if条件取决于参数
【发布时间】:2017-06-21 15:23:12
【问题描述】:

我有以下问题。我有一个参数frc_size。根据 fcr_size 的大小,必须在 if 条件中检查更多距离。有没有办法处理这种聪明并缩短所有这些表达?例如,对于 fcr_size = 3,if 条件如下所示:

minusscore = 2

for coords in full_box:
    mindist = float("inf")
    for m in range(len(lineSegmentPairs[0])):
        newdist = dist(lineSegmentPairs[0][m], lineSegmentPairs[1][m], coords)
        if newdist<mindist:
            mindist=newdist
    if mindist <= radius :
        val1 = int(sparse1.get(coords,"0")[0]) - minusscore
        sparse1[coords] = [str(val1)]
    elif mindist <= (radius +1) :
        val1 = int(sparse1.get(coords,"0")[0]) + 3
        sparse1[coords] = [str(val1)]
    elif mindist <= (radius +2) :
        val1 = int(sparse1.get(coords,"0")[0]) + 2
        sparse1[coords] = [str(val1)]
    elif mindist <= (radius +3) :
        val1 = int(sparse1.get(coords,"0")[0]) + 1
        sparse1[coords] = [str(val1)]
    elif mindist > (radius +3) :
        continue

但如果 fcr_size 为 4,则需要额外的 if 条件,例如:

minusscore = 2

for coords in full_box:
    mindist = float("inf")
    for m in range(len(lineSegmentPairs[0])):
        newdist = dist(lineSegmentPairs[0][m], lineSegmentPairs[1][m], coords)
        if newdist<mindist:
            mindist=newdist
    if mindist <= radius :
        val1 = int(sparse1.get(coords,"0")[0]) - minusscore
        sparse1[coords] = [str(val1)]
    elif mindist <= (radius +1) :
        val1 = int(sparse1.get(coords,"0")[0]) + 4
        sparse1[coords] = [str(val1)]
    elif mindist <= (radius +2) :
        val1 = int(sparse1.get(coords,"0")[0]) + 3
        sparse1[coords] = [str(val1)]
    elif mindist <= (radius +3) :
        val1 = int(sparse1.get(coords,"0")[0]) + 2
        sparse1[coords] = [str(val1)]
    elif mindist <= (radius +4) :
        val1 = int(sparse1.get(coords,"0")[0]) + 1
        sparse1[coords] = [str(val1)]
    elif mindist > (radius +4) :
        continue

【问题讨论】:

  • 你对mindist &lt;= (radius +4)mindist &lt;= (radius +3)的操作是一样的,是不是笔误?
  • 我建议你使用 4 个空格而不是 8 个进行缩进。它肯定会提高可读性,请参阅PEP8
  • 是的,我编辑了 fcr_size 4 的样子

标签: python numpy dictionary if-statement scipy


【解决方案1】:

也许是这样的?

if mindist <= radius:
  val1 = int(sparse1.get(coords,"0")[0]) - minusscore
  sparse1[coords] = [str(val1)]
elif mindist > (radius + fcr_size):
  continue
else:
  for i in range(fcr_size):
    if mindist <= radius + i + 1:
      val1 = int(sparse1.get(coords,"0")[0]) + (fcr_size - i)
      sparse1[coords] = [str(val1)]
      break

【讨论】:

  • 我认为您希望 radius + i + 1if 声明中。
  • 但是我怎么能包含参数 mindist
  • @Varlor if mindist &lt;= radius : # do stuff else: # do for loop 可能是最简单的方法。
  • 是的,这行得通。但我还有另一个问题。使用您的方法,它将为每个 if 条件执行所有操作。在我的代码中,elif 条件只会执行一项操作。例如,如果思想家小于/等于半径+1,则如果忽略条件,我的操作将添加+4 和所有其他分数。但是在您的代码中,当然小于/等于 radius+1 的 mindist 将满足所有条件。
  • @Varlor 只是抛出一个 break 语句。我将修改答案以显示。
【解决方案2】:

if 语句中的代码似乎遵循某种模式,并且可以转换为 for 循环。每个elif 语句都可以是循环的一次迭代,其中包含一个变量而不是硬编码的数字。它会显着减少代码的大小

【讨论】:

  • ……并使其更加灵活。
猜你喜欢
  • 2016-10-05
  • 1970-01-01
  • 1970-01-01
  • 2021-03-10
  • 2017-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多