【问题标题】:For loop heading depending on if statement (Python)For 循环标题取决于 if 语句(Python)
【发布时间】:2013-04-05 19:12:25
【问题描述】:

我想写一个条件 for 循环,如果一个数组的长度为 1,使用一个 for 循环标题,如果这个 len(array) > 1 并且 == len(array2),使用不同的 for 循环标题,如果这些条件都不成立,请退出并选择我的错误。 真正的问题是我不想有这个 if 语句,然后是 for 循环,当 for 循环实际上是相同的时,除了标题,而且相当长,所以加倍代码似乎是一种浪费。

有没有一种很好的方法可以做到这一点,我只需要编写一次 for 循环的内容?

注意:xarray 和 tarray 是多维 numpy 数组 即)xarray = array([[1,2,3],[4,5,6]])

代码片段如下所示:

if len(tarray) > 1 and len(xarray) == len(tarray):
        for x,ts in zip(xarray,tarray):
           #stuff
if len(tarray) == 1:
        for x in xarray:
           #same stuff as above for loop
else:
        print 'Dimension Mismatch -- Quitting:'
        quit()

【问题讨论】:

  • 如果您提供更多关于“for 循环的内容”的信息,这将非常有帮助。我怀疑,因为您使用的是 numpy,某种 broadcasting 可能是适合这种情况的正确工具。
  • for 循环的核心是对与 tarray 中的 t 值对应的 xarray(x 值)中的数组进行三角插值。本质上,我想说“嘿,xarray 有 5 个 x 数据块,而 tarray 只有一个,对所有 5 个 xarray 使用相同的 tarray 值”或“嘿,xarray 有 n 个块,tarray 也是如此,所以让我们使用 xarray[i] 和 tarray[i] from i = 0,1,...,n"

标签: python if-statement for-loop python-2.7 numpy


【解决方案1】:

如果 for 循环的内容相同,那么您可以从两个 for 循环中调用一个包含公共代码的函数。

还有if语句,如果你想满足条件,检查是必要的。

【讨论】:

  • 很好的答案,但是如果可能的话,我想保持这个函数免费,因为它只是一个文件,我将根据需要放入一个包中调用。
  • 所以for循环应该只是一个文件输出语句?
【解决方案2】:

这应该可行:

if len(tarray) >= 1:
    res = zip(tarray, xarray) if len(tarray) == len(xarray) else xarray
else:
    # Error message

for each in res:
    # Do some stuff 

【讨论】:

    【解决方案3】:

    如果我正确理解您的问题,在 for 循环之前您应该能够执行以下操作:

    try:
        xx, tt = np.broadcast_arrays(xarray,tarray)
     except ValueError:
        # raised if two arrays cannot be broadcast together
    
    for x, t in zip(xx,tt):
        # do stuff
    

    所以,例如:

    >>> xarray = np.arange(6).reshape((2,3))
    >>> tarray = np.atleast_2d(np.arange(3))
    >>> xarray
    array([[0, 1, 2],
           [3, 4, 5]])
    >>> tarray
    array([[0, 1, 2]])
    >>> xx, tt = np.broadcast_arrays(xarray,tarray)
    >>> xx
    array([[0, 1, 2],
           [3, 4, 5]])
    >>> tt
    array([[0, 1, 2],
           [0, 1, 2]])
    >>> tarray = np.arange(6,12).reshape((2,3))
    >>> tarray
    array([[ 6,  7,  8],
           [ 9, 10, 11]])
    >>> xx, tt = np.broadcast_arrays(xarray,tarray)
    >>> tt
    array([[ 6,  7,  8],
           [ 9, 10, 11]])
    

    我还建议事先检查一下xarraytarray 都是二维的。

    【讨论】:

      【解决方案4】:

      为了在运行时更改for 循环头,您可以使用exec

      codeToRun = "";
      
      if len(tarray) > 1 and len(xarray) == len(tarray):
              codeToRun += """for x,ts in zip(xarray,tarray): """
      elif len(tarray) == 1:
              codeToRun += """for x in xarray:"""
      else:
              codeToRun += """print 'Dimension Mismatch -- Quitting:'
              quit()"""
      
      exec codeToRun + """# rest of code """
      

      查看How do I execute a string containing Python code in Python? 并考虑使用eval

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-27
        • 1970-01-01
        • 2021-02-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多