繁体   English   中英

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

[英]Nested list comprehension with dependent conditional

我正在尝试将此条件子句放入我的列表比较“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 替换每个“_”)

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM