猿问

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

我正在尝试将此条件子句放入我的列表比较“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 语句之后(我,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

对于 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 替换每个“_”)


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


慕容3067478
浏览 190回答 3
3回答

慕莱坞森

您可以像@user2357112 建议的那样简化一些事情:import numpy as npimport pandas as pdn = 6arr = ([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)输出:&nbsp; &nbsp; 0&nbsp; &nbsp;1&nbsp; &nbsp; &nbsp;2&nbsp; &nbsp; &nbsp;3&nbsp; &nbsp;4&nbsp; &nbsp;50 NaN&nbsp; &nbsp;6&nbsp; &nbsp;NaN&nbsp; &nbsp;NaN NaN NaN1 NaN&nbsp; &nbsp;7&nbsp; 13.0&nbsp; &nbsp;NaN NaN NaN2 NaN&nbsp; &nbsp;8&nbsp; 14.0&nbsp; 20.0 NaN NaN3 NaN&nbsp; &nbsp;9&nbsp; 15.0&nbsp; 21.0 NaN NaN4 NaN&nbsp; 10&nbsp; 16.0&nbsp; &nbsp;NaN NaN NaN5 NaN&nbsp; 11&nbsp; &nbsp;NaN&nbsp; &nbsp;NaN NaN NaN

慕森卡

你可以把它放在内部列表理解中: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 exampleprint(arr)[[10],&nbsp;[11, 21],&nbsp;[12, 22, 32],&nbsp;[13, 23, 33, 43],&nbsp;[14, 24, 34, 44, 54],&nbsp;[15, 25, 35, 45, 55],&nbsp;[16, 26, 36, 46],&nbsp;[17, 27, 37],&nbsp;[18, 28],&nbsp;[19]]编辑:如果您希望在具有所需输出的 DataFrame 中使用它:import numpy as npimport pandas as pdn = 10arr = [[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)&nbsp; &nbsp; 0&nbsp; &nbsp;1&nbsp; &nbsp; &nbsp;2&nbsp; &nbsp; &nbsp;3&nbsp; &nbsp; &nbsp;4&nbsp; &nbsp; &nbsp;5&nbsp; &nbsp;6&nbsp; &nbsp;7&nbsp; &nbsp;8&nbsp; &nbsp;90 NaN&nbsp; 10&nbsp; &nbsp;NaN&nbsp; &nbsp;NaN&nbsp; &nbsp;NaN&nbsp; &nbsp;NaN NaN NaN NaN NaN1 NaN&nbsp; 11&nbsp; 21.0&nbsp; &nbsp;NaN&nbsp; &nbsp;NaN&nbsp; &nbsp;NaN NaN NaN NaN NaN2 NaN&nbsp; 12&nbsp; 22.0&nbsp; 32.0&nbsp; &nbsp;NaN&nbsp; &nbsp;NaN NaN NaN NaN NaN3 NaN&nbsp; 13&nbsp; 23.0&nbsp; 33.0&nbsp; 43.0&nbsp; &nbsp;NaN NaN NaN NaN NaN4 NaN&nbsp; 14&nbsp; 24.0&nbsp; 34.0&nbsp; 44.0&nbsp; 54.0 NaN NaN NaN NaN5 NaN&nbsp; 15&nbsp; 25.0&nbsp; 35.0&nbsp; 45.0&nbsp; 55.0 NaN NaN NaN NaN6 NaN&nbsp; 16&nbsp; 26.0&nbsp; 36.0&nbsp; 46.0&nbsp; &nbsp;NaN NaN NaN NaN NaN7 NaN&nbsp; 17&nbsp; 27.0&nbsp; 37.0&nbsp; &nbsp;NaN&nbsp; &nbsp;NaN NaN NaN NaN NaN8 NaN&nbsp; 18&nbsp; 28.0&nbsp; &nbsp;NaN&nbsp; &nbsp;NaN&nbsp; &nbsp;NaN NaN NaN NaN NaN9 NaN&nbsp; 19&nbsp; &nbsp;NaN&nbsp; &nbsp;NaN&nbsp; &nbsp;NaN&nbsp; &nbsp;NaN NaN NaN NaN NaN

梵蒂冈之花

from pandas import DataFrame as dfimport numpy as npn = {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))我现在仍然可以使用一些帮助来简化条件。
随时随地看视频慕课网APP

相关分类

Python
我要回答