Цикл Python для создания двухколоночного макета - PullRequest
0 голосов
/ 15 февраля 2019

Я пытаюсь сделать цикл из двух столбцов в Python и Dash-Bootstrap-Component.Проблема связана с Python, я не совсем понимаю, как этого добиться.Я перебираю список значений.Макет должен состоять из нескольких строк, каждая с двумя столбцами.

(код краткости)

figs=[]
figs.append(dict(data=data, layout=layout)) # dash
body = dbc.Container(
    [
        dbc.Row(
            [                 
                dbc.Col(
                    [
                        html.H4('ES'+str(i)),
                        dcc.Graph(figure=figs[i]) 
                    ],
                    md=6
                ),
                dbc.Col(
                    [
                        html.H4('ES'+str(i+1)),
                        dcc.Graph(figure=figs[i+1]) # <- how to increment i here? This syntax 'figs[i+1]' throws an error.
                    ]
                )

            ]
        )       
       for i, value in enumerate(figs)
    ]
)

Мне нужно отобразить график figs[i] в первом столбце, а затем увеличить индекс для отображенияследующий график во втором столбце.figs[i+1] не работает, и я не уверен, как вложить цикл for или сделать цикл while в этом коде.Я приложил изображение, показывающее, что код работает при использовании одного и того же figs[i] для двух столбцов.

multiple rows - two columns

ОБНОВЛЕНИЕ: благодаря ответу Эркандеманиже я смог прийти к выводу, который размещен здесь:

figs.append(dict(data=data, layout=layout))

body_py = [0] * len(figs)

for i, value in enumerate(figs):
    left = i
    right = i + 1 if i+1 < len(figs) else 0

    body_py[left] = figs[left]
    body_py[right] = figs[right]

body = dbc.Container(
    [
        dbc.Row(
            [
                dbc.Col(
                    [
                        html.H4('ES '+str(i)),
                        dcc.Graph(figure=body_py[i])
                    ],
                    md=6,
                )
                for i, value in enumerate(body_py)
            ]
        )
    ]
)

app.layout = html.Div([body])

enter image description here

1 Ответ

0 голосов
/ 15 февраля 2019

основной вопрос сводится к (i + i + 1) вместо i + 1 (не правда ли?)

figs = [0, 1, 2, 3, 4, 5, 6, 7]
body = [0] * int((len(figs) / 2))


if len(figs) % 2 is not 0:
    print('appebnd a dummy figure')

for i in range(len(body)):
    # foreplay
    row = str(i)
    left = i + i
    right = (i + i + 1)
    print([row, left, right])

    # action
    body[i] = {row: [dict(h4=str(left), graph=figs[left]), dict(h4=str(right), graph=figs[right])]}

for row in body:
    print(row)

, который печатает:

{'0': [{'h4': '0', 'graph': 0}, {'h4': '1', 'graph': 1}]}
{'1': [{'h4': '2', 'graph': 2}, {'h4': '3', 'graph': 3}]}
{'2': [{'h4': '4', 'graph': 4}, {'h4': '5', 'graph': 5}]}
{'3': [{'h4': '6', 'graph': 6}, {'h4': '7', 'graph': 7}]}
...