具有依赖条件的嵌套列表理解

时间:2019-01-13 21:27:39

标签: python arrays if-statement list-comprehension ternary-operator

我正在尝试将此条件子句放入列表组合“ arr”。

arr = [[(i*n+j) for i in range(n)] for j in range(n)]

if ( 2*i<=j+i+1<=n+1 and i>0)

作为条件。我试着把这个:

-在三元数前面有else语句:“”,但这会在数组中产生不需要的元素。

-就像我的for语句之后一样(i,j,甚至都尝试过)

关于如何在不增加太多复杂性的情况下进行计算的任何想法?

所需的示例输出:

from pandas import DataFrame as df
n = 5
arr= [NEEDS HELP HERE]

print(df(arr))

>>> 
   0   1    2     3    4
0 NaN  5   NaN   NaN  NaN
1 NaN  6  11.0   NaN  NaN
2 NaN  7  12.0  17.0  NaN
3 NaN  8  13.0   NaN  NaN
4 NaN  9   NaN   NaN  NaN

FOR n = 3

>>>  
   0   1    2 
0 NaN  3  NaN
1 NaN  4  7.0
2 NaN  5  NaN

对于n = 2

>>> 
   0   1 
0 NaN  2
1 NaN  3

对于n = 10(我的代码可以生成以下内容)

>>>
  0   1   2   3   4   5  6  7  8  9
0  _  10   _   _   _   _  _  _  _  _
1  _  11  21   _   _   _  _  _  _  _
2  _  12  22  32   _   _  _  _  _  _
3  _  13  23  33  43   _  _  _  _  _
4  _  14  24  34  44  54  _  _  _  _
5  _  15  25  35  45  55  _  _  _  _
6  _  16  26  36  46   _  _  _  _  _
7  _  17  27  37   _   _  _  _  _  _
8  _  18  28   _   _   _  _  _  _  _
9  _  19   _   _   _   _  _  _  _  _

如您所见,每个应该产生一个nxn矩阵。 (我可以将每个“ _”替换为np.NaN)

我将在下面发布解决方案。非常感谢您的所有贡献。

3 个答案:

答案 0 :(得分:0)

您可以将其放在内部列表理解中:

arr = [[(i*n+j) for i in range(n) if ( 2*i<=j+i+1<=n+1 and i>0)] for j in range(n)]

输出:

n = 10 # for example
print(arr)

[[10],
 [11, 21],
 [12, 22, 32],
 [13, 23, 33, 43],
 [14, 24, 34, 44, 54],
 [15, 25, 35, 45, 55],
 [16, 26, 36, 46],
 [17, 27, 37],
 [18, 28],
 [19]]

编辑:

如果要在具有所需输出的DataFrame中使用它:

import numpy as np
import pandas as pd

n = 10
arr = [[np.NaN] + [(i*n+j) for i in range(n) if ( 2*i<=j+i+1<=n+1 and i>0)] + [np.NaN] * (n - j - 2) for j in range(n)]

pd.DataFrame(arr)

    0   1     2     3     4     5   6   7   8   9
0 NaN  10   NaN   NaN   NaN   NaN NaN NaN NaN NaN
1 NaN  11  21.0   NaN   NaN   NaN NaN NaN NaN NaN
2 NaN  12  22.0  32.0   NaN   NaN NaN NaN NaN NaN
3 NaN  13  23.0  33.0  43.0   NaN NaN NaN NaN NaN
4 NaN  14  24.0  34.0  44.0  54.0 NaN NaN NaN NaN
5 NaN  15  25.0  35.0  45.0  55.0 NaN NaN NaN NaN
6 NaN  16  26.0  36.0  46.0   NaN NaN NaN NaN NaN
7 NaN  17  27.0  37.0   NaN   NaN NaN NaN NaN NaN
8 NaN  18  28.0   NaN   NaN   NaN NaN NaN NaN NaN
9 NaN  19   NaN   NaN   NaN   NaN NaN NaN NaN NaN

答案 1 :(得分:0)

您可以按照@ user2357112的建议进行一些简化:

import numpy as np
import pandas as pd

n = 6
arr = ([i*n+j for i in range(1,n-j+1) if i<=j+1] for j in range(n))
df = pd.DataFrame([np.NaN]+x+[np.NaN]*(n-len(x)-1) for x in arr)
print(df)

输出:

    0   1     2     3   4   5
0 NaN   6   NaN   NaN NaN NaN
1 NaN   7  13.0   NaN NaN NaN
2 NaN   8  14.0  20.0 NaN NaN
3 NaN   9  15.0  21.0 NaN NaN
4 NaN  10  16.0   NaN NaN NaN
5 NaN  11   NaN   NaN NaN NaN

答案 2 :(得分:0)

from pandas import DataFrame as df
import numpy as np
n = {USERINPUT_Var_(int>1)}

arr = [[i*n+j if ( 2*i<=j+i+1<=n+1 and i>0) else np.NaN for i in range(n)] for j in range(n)]

print(df(arr))

我现在仍然可以使用一些简化条件的帮助。