仅通过有序dict进行迭代

时间:2018-08-01 12:43:20

标签: python

我正在尝试做这样的事情:

## a is a dataframe ##
## b is a ordered dictionary ##
for row in a.itertuples():
    while True:
        try:
            next_iter = next(b.keys())
        else:
            break
        if b[next_iter].method == 'run' and row.method == 'run:
            print(True)
            break

但是我收到TypeError:

  

TypeErrorTraceback(最近一次通话最近)    在()中   ----> 1个下一个(dict_by_trigger.keys())

     

TypeError:“ odict_keys”对象不是迭代器

创建此迭代的最佳方法是什么,这样我只遍历字典键和数据框一次?

2 个答案:

答案 0 :(得分:0)

错误告诉您无法在next的返回值上调用b.keys()。我认为try-else的逻辑有点过分。像这样循环遍历你的字典怎么样?

for row in a.itertuples():
    for k, v in b.items():
        if v.method == 'run' and row.method == 'run':
            print(True)
            break

编辑:还是您正在尝试在运行其方法的每个可迭代对象中找到对象?在那种情况下,我不会嵌入循环,而只是使用两个不同的循环。这将是O(N ^ 2)与更好的O(N)。

df_row = None
odict_val = None

for row in a.itertuples():
    if row.method == 'run':
        df_row = row
        break

for v in b.values():
    if v.method == 'run':
        odict_val = v
        break

答案 1 :(得分:0)

尚不完全清楚您要达到的目标,但是据我所知,您想仅一次 循环数据框和字典,即您不想重新启动内部循环数据框中的每个元素,但继续上一个迭代中您离开的位置。在这种情况下,请使用iter函数创建字典元素的迭代器。

简化示例:

A = range(10)
B = range(10)
itB = iter(B)
for a in A:
    for b in itB:
        if b % 2 == 0:
            print(a, b)
            break 

这将产生0 01 22 43 64 8对。