for循环上的奇怪行为

时间:2019-02-01 10:03:20

标签: python plotly-dash

早上好。

我在Dahs-plotly中的函数内使用了for循环(我不知道这是否重要)。关键是自第二次迭代以来,我在处理熊猫数据帧时遇到了奇怪的循环行为。下面我显示一个示例:

list_items = ['item1', 'item2', 'item3']

for item in list_items:

    info = df_base[df_base.item == item].copy()
    More similar code...

在第一次迭代中没有问题,我得到了item = 'item1',但是在第二次迭代中,由于迭代器失败,代码在More similar code...中失败了。

我正在使用pdb包进行调试,并将代码暂停在info = df_base[df_base.item == item].copy()上方。令我惊讶的是,在暂停编译的情况下,有时item = 'item1',有时是item = 'item2',而正确的行为是item = 'item2'

这是我第一次遇到这样的错误并且感到惊讶,因此在网上寻找解决方案时,我发现了迭代器(其中每次迭代都消除了迭代器的值),所以我的代码是:

list_items = iter(['item1', 'item2', 'item3'])
done_loop = False

while not done_loop:
    try:
        item = next(list_items)
    except StopIteration:
        done_loop = True
    else:
        info = df_base[df_base.item == item].copy()
        More similar code...

但是错误仍然相同。

希望你能帮助我。

非常感谢您。

编辑

我已删除info = df_base[df_base.item == item].copy()下的所有代码,所以我的代码是:

list_items = iter(['item1', 'item2', 'item3'])
done_loop = False

while not done_loop:
    try:
        item = next(list_items)
    except StopIteration:
        done_loop = True
    else:
        info = df_base[df_base.item == item].copy()
        print iter
        print info

在提示符下,我仍然遇到相同的错误:iter1; (right info 1); iter2; iter1; (right info 2); iter3; (wrong info 1);等等...

编辑2

import pandas as pd

data      = {1.0: [0,1,2,3,4], 2.0: [54,12,32,45,78], 'table': ['t1','t1', 't2','t3','t4']}
info_base = pd.DataFrame(data = data)

list_tables = iter(info_base.table.unique().tolist())

done_looping = False

while not done_looping:
    try:
        table = next(list_tables)  
    except StopIteration:
        done_looping = True
    else:
        info  = info_base[info_base.table == table].copy()
        print table
        print info

1 个答案:

答案 0 :(得分:0)

我没有足够的声誉来评论您的问题,但是您是否正在使用for循环动态创建回调?

如果是,我也遇到了相同的问题,并通过回调中的State获得了组件的ID,从而解决了该问题

例如:

for component_id, component_property in dash_layout_components.items():
    @app.callback(
        Output(component_id, component_property),
        [Input(key, value) for key, value in set_back_and_display_graph_input.items()],
        [State(component_id, 'id')]

我必须在函数内部获取迭代器值,但是我面临的问题与您相同,因此我添加了component_id作为State以便能够将其包含在函数中