为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕容3067478 2021-10-10 16:42:07
我正在尝试将此条件子句放入我的列表比较“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 dfn = 5arr= [NEEDS HELP HERE]print(df(arr))>>>    0   1    2     3    40 NaN  5   NaN   NaN  NaN1 NaN  6  11.0   NaN  NaN2 NaN  7  12.0  17.0  NaN3 NaN  8  13.0   NaN  NaN4 NaN  9   NaN   NaN  NaN对于 n = 3>>>     0   1    2 0 NaN  3  NaN1 NaN  4  7.02 NaN  5  NaN对于 n = 2>>>    0   1 0 NaN  21 NaN  3对于 n = 10(我的代码可以生成以下内容)>>>  0   1   2   3   4   5  6  7  8  90  _  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 回答

?
慕莱坞森

TA贡献1810条经验 获得超4个赞

您可以像@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


查看完整回答
反对 回复 2021-10-10
?
慕森卡

TA贡献1806条经验 获得超8个赞

你可以把它放在内部列表理解中:


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


查看完整回答
反对 回复 2021-10-10
?
梵蒂冈之花

TA贡献1900条经验 获得超5个赞

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))

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


查看完整回答
反对 回复 2021-10-10
  • 3 回答
  • 0 关注
  • 196 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号