迭代嵌套列表,通过向右看而不是向下看,与其他列表项进行比较

时间:2019-07-03 19:51:55

标签: python python-3.x python-3.7

下面有一个名为row_list的嵌套列表:

[
    [{
        'text': 'Page 1, col 1.',
        'top': Decimal('83.640')    
    }],
    [{
        'text': 'Page 1, col 2.',
        'top': Decimal('112.920')
    }],
    [{
        'text': 'Page 1, col 3',
        'top': Decimal('127.560'),
    }]
]

现在,我正在尝试迭代此列表列表。

但是,当我进行迭代时,我想将n列表中的每个项目都带走,并在右侧“查找”-意味着我想在以下列表中签入(除非它是最后一个列表),即同一n项目的值。

例如,对于列表的第一次迭代,如下所示:

[{
   'text': 'Page 1, col 1.',
   'top': Decimal('83.640')    
}]

在这里,我要检查其他列表中其他top项目的n值。如果该最高值不相同(或在公差级别10之内),我想在同一n位置-但在另一个列表中添加一个新项目。

因此,按照上面的示例,83.640的最高级别不在其他两个列表中的可接受范围内,因此我们应该为每个列表添加一个项目:

[
    [{
        'text': 'Page 1, col 1.',
        'top': Decimal('83.640')    
    }],
    [{
        'text': '', #added item
        'top': Decimal('83.640')
    },{
        'text': 'Page 1, col 2.',
        'top': Decimal('112.920')
    }],
    [{
        'text': '', #added item
        'top': Decimal('83.640')
    },{
        'text': 'Page 1, col 3',
        'top': Decimal('127.560'),
    }]
]

我试图弄清楚如何从左到右而不是从上到下查看列表。这是我到目前为止的内容:

for col_no, col in enumerate(row_list):
    #Don't compare the last list, as there are no more lists to compare to.
    if col != row_list[-1]:
        for line in col:
            currentTopValue = line['top']
            nextColValue = row_list[col_no + 1][0]['top']
            if abs(currentTopValue - nextColValue) >= float(10):
                row_list.insert(0, [{'text': '', 'top': currentTopValue}])

如您所见,以上内容是静态的(硬编码索引)。行列表在每个列表中可以包含许多项。

由于某种原因,当我执行代码时,它无法运行(似乎正在挂起-可能是瓶颈?)

有人可以引导我朝正确的方向前进吗?

2 个答案:

答案 0 :(得分:0)

代替此if语句:

if col != row_list[-1]:

尝试明智地构建循环:

for col_no, col in enumerate(row_list[:-1]):

由于您在for循环中插入了row_list个新元素,因此您的代码无法正常工作。 那里:

            row_list.insert(0, [{'text': '', 'top': currentTopValue}])

创建temp_row_list = []的好方法 并将这些数据插入其中。

它应该工作,请检查以下内容:

temp_row_list = []
for col_no, col in enumerate(row_list[:-1]):
    for line in col:
        currentTopValue = line['top']
        nextColValue = row_list[col_no + 1][0]['top']
        if abs(currentTopValue - nextColValue) >= float(10):
            temp_row_list.append([{'text': '', 'top': currentTopValue}])

答案 1 :(得分:0)

因为我们要修改添加a.zipWith(b)((fromA, fromB) => fromA)的子列表,所以我们想跟踪谁是原始元素;因为您将dict属性设置为'top',所以我们可以在子列表中搜索包含某些文本的第一个元素。

''

然后我们可以按指定的公差循环遍历列表。我们可以使用当前子列表的计数器,并在def get_elem_for_sublist(sublist: list): for elem in sublist: # dict if elem['text'] != '': return elem return None 循环的末尾将其增加1。

通过枚举获取索引和子列表,我们可以检查while,获取if counter_sublist == idx,或者value_to_comparevalue之间的当前差大于{{1 }}。

value_to_compare

输出为

tolerance