Понимание вложенного списка с зависимым условным - PullRequest
0 голосов
/ 14 января 2019

Я пытаюсь поместить это условное предложение в мой список 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 в троичной области спереди: "", но это создает нежелательные элементы в массиве.

-как за моими утверждениями (я, j и даже пробовал оба)

Какие-нибудь идеи о том, как заставить это вычислять, не добавляя много сложности?

Требуемый пример Ouput:

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)

Я опубликую решение ниже. Большое спасибо за все вклады.

Ответы [ 3 ]

0 голосов
/ 14 января 2019

Вы можете немного упростить ситуацию, как @ 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
0 голосов
/ 14 января 2019
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))

Я все еще могу использовать некоторую помощь для упрощения условного выражения.

0 голосов
/ 14 января 2019

Вы можете поместить его во внутренний список понимания:

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

EDIT:

Если вы хотите его в 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
...