0

我想写一个条件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()
4

4 回答 4

4

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

如果您希望满足条件,则需要检查 if 语句。

于 2013-04-05T19:22:00.210 回答
2

如果我正确理解您的问题,在 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都是二维的。

于 2013-04-05T19:38:08.600 回答
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 
于 2013-04-05T19:49:10.460 回答
0

为了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 """

请参阅如何在 Python 中执行包含 Python 代码的字符串?并考虑使用eval.

于 2013-04-05T20:04:04.567 回答