【问题标题】:Nested list comprehension with dependent conditional具有依赖条件的嵌套列表理解
【发布时间】:2019-06-07 23:04:16
【问题描述】:

我正在尝试将此条件子句放入我的列表 comp“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

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

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

【问题讨论】:

  • 虽然将该条件插入到您的理解中很简单,但调整内部 range 的边界似乎更有意义。
  • 我将尝试“旋转”列表 CW,并在索引 0 中插入一个空列表。如果有任何其他方法,请告诉我。 (会告诉你它是否有效)

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


【解决方案1】:

你可以把它放在内部列表推导中:

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

【讨论】:

  • 好的,这让我接近了我正在寻找的东西。我使用 Pandas DataFrame() 打印出实际的数组版本。然而,我需要它来表示一个方阵,其中第一列是用 NaN“填充”,第二列(对于 n=10,是 10->19)等等,最后一列可能被填充,也可能不被填充完全产生一个方阵。我将稍后用所需的输出更新我的问题。非常感谢您的贡献。
  • @Numoru 还有其他问题吗?
  • 它很接近它不适用于所有 n 个案例 >1。矩阵应保持 nxn 形式。
  • @Numoru 您能否为n = 8n = 9n = 10 添加所需的输出?无论是否填充最后一列,都无法得到正方形。
  • 我将接受您的回答,因为我可以在我已经编写的代码中使用 np.NaN 我将发布解决方案。
【解决方案2】:
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))

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

【讨论】:

  • 请避免提出更多与原始问题无关的问题并寻求答案。如有必要,请提出新问题。
  • @Tomothy32 感谢您的帮助。给定这种形式,我是否应该问另一个问题,看看谁能减少条件? (也很抱歉在其他评论中拼错了名字)
  • 这是正确的最终答案。 Tomothy32's 是一种效率低下的捷径,因为它无法用 np.Nan 填充矩阵的所有必要元素,因此无法应用 zip() 和其他矩阵方法。
【解决方案3】:

您可以按照@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-11-17
    • 2022-11-07
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    • 2014-01-18
    • 2020-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多