Как сделать два цикла для одного python l oop? - PullRequest
2 голосов
/ 12 февраля 2020

Я не хочу сокращать это:

for x in data1:
    for y in data2:
        *lines*

, но сделать это:

for x in data1:
    *lines*

for y in data2:
    *lines*

в один l oop как этот (x - строка из data1 а у - только строка из data2):

for x,y in data1,data2:
    *lines*

возможно ли это? Я хочу уместить и затем предсказать наивные байесовские данные в одном l oop:

# group data by prodi
for no, dfx_prodi in dfx.groupby('prodi'):
    # implement naive bayes fit data
    bnb.fit(dfx_prodi[var], dfx_prodi['daftar_kembali'])

for no, dfy_prodi in dfy.groupby('prodi'):
    # implement naive bayes predict data
    y_pred = bnb.predict(dfy_prodi[var])

Это работает, но результат кажется сомнительным, есть ли способ сделать это за один l oop, пока держать группу?

Ответы [ 2 ]

4 голосов
/ 12 февраля 2020

Если я что-то не так понял, вы можете просто использовать функцию zip, например, как

for x,y in zip(x_list,y_list):
    print(x,y)

В вашем случае это должно быть что-то вроде

for (no, dfx_prodi), (no, dfy_prodi) in zip(dfx.groupby('prodi'), dfy.groupby('prodi')):
    # implement naive bayes fit data
    bnb.fit(dfx_prodi[var], dfx_prodi['daftar_kembali'])
    y_pred = bnb.predict(dfy_prodi[var])
3 голосов
/ 12 февраля 2020

Если два списка (итерируемых) data1 и data2 имеют одинаковую длину, вы можете сделать следующее:

for x, y in zip(data1, data2):
    do_something(x, y)

zip создает кортежи (x, y) из 2 или более итераций. Если data1 и data2 не имеют одинаковую длину, вы можете посмотреть на zip_longest в стандартной библиотеке itertools (она добавляет None значения для отсутствующих элементов).

...