gpt4 book ai didi

python - 动态过滤列表并删除循环中的项目

转载 作者:太空宇宙 更新时间:2023-11-04 01:56:00 24 4
gpt4 key购买 nike

我有以下数据(在我的代码列表中表示):

word_list = [{'bottom': Decimal('58.650'),  
'text': 'Contact'
},
{'bottom': Decimal('77.280'),
'text': 'email@domain.com'
},
{'bottom': Decimal('101.833'),
'text': 'www.domain.com'
},
{'bottom': Decimal('116.233'),
'text': '(Acme INC)'
},
{'bottom': Decimal('74.101'),
'text': 'Oliver'
},
{'bottom': Decimal('90.662'),
'text': 'CEO'
}]

以上数据来自PDF文本提取。我正在尝试根据 bottom 值解析它并保持布局格式。

思路是检查当前单词的bottom值,然后找到所有匹配的单词,即特定范围内容差为 threshold=

这是我的代码:

threshold = float('10')
current_row = [word_list[0], ]
row_list = [current_row, ]

for word in word_list[1:]:

if abs(current_row[-1]['bottom'] - word['bottom']) <= threshold:
# 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)

因此这将返回批准阈值内的单词列表。

我有点卡在这里,因为在迭代列表时,可能会发生这些单词的 bottom 值彼此非常接近,因此它会选择相同的接近单词在多次迭代中。

例如,如果一个单词的底值接近于已添加到 row_list 中的单词,它只会再次将其添加到列表中。

我想知道是否可以删除已经迭代/添加的单词?像这样的东西:


if abs(current_row[-1]['bottom'] - word['bottom']) <= threshold:
[...]
else:
[...]

del word from word_list

但是我不确定如何实现它?因为我无法在循环中修改 word_list

最佳答案

您可以指定排序参数,例如

word_list.sort(key=lambda x: x['bottom'])

这导致

word_list.sort(key=lambda x: x['bottom'])
rows = []
current = [word_list.pop(0)] # reversing the sort and using pop() is more efficient
while word_list:
if word_list[0]['bottom'] - current[-1]['bottom'] < threshold:
current.append(word_list.pop(0))
else:
rows.append(current)
current = [word_list.pop(0)]
rows.append(current)

代码遍历 word_list 直到它为空。将当前单词(在位置 0,尽管反转会提高效率)与上次排序的单词进行比较。最终结果是 (pprint.pprint(rows)):

[[{'bottom': Decimal('58.650'), 'text': 'Contact'}],
[{'bottom': Decimal('74.101'), 'text': 'Oliver'},
{'bottom': Decimal('77.280'), 'text': 'email@domain.com'}],
[{'bottom': Decimal('90.662'), 'text': 'CEO'}],
[{'bottom': Decimal('101.833'), 'text': 'www.domain.com'}],
[{'bottom': Decimal('116.233'), 'text': '(Acme INC)'}]]

关于python - 动态过滤列表并删除循环中的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56809050/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com