比较循环中的下一项,连接字符串并保留列表项

时间:2019-07-03 16:35:23

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

我在defaultdict(list)以下叫cols

defaultdict(<class 'list'>,
{1: [{'text': 'Page',
       'top': Decimal('83.640')
    },{'text': '1,',
       'top': Decimal('83.640')
    },{'text': 'col',
       'top': Decimal('98.040')
    },{'text': '1.',
       'top': Decimal('98.040')
    }],
2: [{'text': 'Page',
    'top': Decimal('112.920')
    },{'text': '1,',
    'top': Decimal('112.920')
    },{'text': 'col',
    'top': Decimal('132.020')
    },{'text': '2.',
    'top': Decimal('132.020')
    }],
3: [{'text': 'Page',
    'top': Decimal('127.560')
    },{'text': '1,',
    'top': Decimal('127.560')
    },{'text': 'col',
    'top': Decimal('167.060')
    },{'text': '3',
    'top': Decimal('167.060')
}]})

我想进行转换,因此对于col中的每个defaultdict(list)(1、2和3),如果{{{ 1}}值等于(或在容差范围内)列表中下一个text字符串的级别。

如果没有,我想添加代表“新行”的内容。

例如,上述列表:

top

到目前为止,这是我的代码:

text

但是,这似乎只是添加了所有元素的新列表(与我的原始元素相同,但没有1,2,3键)。

预期输出:

[0]:
Page 1,
Col 1.
[1]:
Page 1,
Col 2.
[2]:
Page 1,
Col 3.

如上所示,如果current_row = [list(cols.values())[0][0], ] #The first word. row_list = [current_row,] for col in cols.values(): for i, word in enumerate(col): prevWord = col[i - 1] if i > 0: # skip first word if abs(prevWord['bottom'] - word['bottom']) <= float(10): #10 is the tolerance level. #distance is small, use same row current_row.append(word) else: # distance is big, create new row current_row = [word, ] row_list.append(current_row) 值在公差级别之内并且为该项目保留了{ [{'text': 'Page 1,', 'top': Decimal('83.640') },{'text': 'col 1.', 'top': Decimal('98.040') }], [{'text': 'Page 1,', 'top': Decimal('112.920') },{'text': 'col 2.', 'top': Decimal('132.020') }], [{'text': 'Page 1,', 'top': Decimal('127.560') },{'text': 'col 3.', 'top': Decimal('167.060') }] } 值,则text已被串联。

1 个答案:

答案 0 :(得分:1)

您的代码中的问题是,当差异在公差范围内时,您就不会串联字符串。您只是制作一个新商品。尝试以下代码:

row_list = []
for col in cols.values():
    current_row = [col[0]]
    for i, word in enumerate(col):
        prevWord = col[i - 1]
        if i > 0:  # skip first word
            if abs(prevWord['top'] - word['top']) <= float(10): #10 is the tolerance level.
                #distance is small, use same row
                current_row[-1]['text'] += " " + word['text']
            else:
                # distance is big, create new row
                current_row.append(word) 
    row_list.append(current_row)
    current_row = []

print(row_list)