من از کد زیر برای مرتب کردن کلمه هایی که در یک خط قرار دارند استفاده کردم. حالا ازت میخوام کد زیر رو افزایش بدی بطوری که بعد از مرتب کردن کلمه های در یک لاین یا خط اونا رو براساس left جاشو تو همون خط مشخص کنی.

import json

# نمونه داده‌های استخراج شده توسط OCR
data = [
    {'text': '۱۰۹', 'left': 0.3088709677419355, 'top': 0.24444444444444444, 'width': 0.02338709677419355, 'height': 0.008547008547008548},
    {'text': 'مشخصات', 'left': 0.6209677419354839, 'top': 0.2717948717948718, 'width': 0.06935483870967742, 'height': 0.014814814814814815},
    {'text': 'کامل', 'left': 0.5830645161290322, 'top': 0.2723646723646724, 'width': 0.03225806451612903, 'height': 0.014814814814814815},
    {'text': 'لاین', 'left': 0.5483870967741935, 'top': 0.2729344729344729, 'width': 0.029838709677419355, 'height': 0.014814814814814815},
    {'text': 'و', 'left': 0.5346774193548387, 'top': 0.2729344729344729, 'width': 0.007258064516129033, 'height': 0.014814814814814815},
    {'text': 'رقمهای', 'left': 0.4774193548387097, 'top': 0.2729344729344729, 'width': 0.05161290322580645, 'height': 0.014814814814814815},
    {'text': 'موتانت', 'left': 0.4241935483870968, 'top': 0.27350427350427353, 'width': 0.0467741935483871, 'height': 0.014814814814814815},
    {'text': 'موسى', 'left': 0.36935483870967745, 'top': 0.2740740740740741, 'width': 0.04838709677419355, 'height': 0.014814814814814815},
    {'text': 'طارم', 'left': 0.3225806451612903, 'top': 0.27464387464387463, 'width': 0.04112903225806452, 'height': 0.014245014245014245},
    {'text': 'و', 'left': 0.3096774193548387, 'top': 0.27521367521367524, 'width': 0.007258064516129033, 'height': 0.014814814814814815},
    {'text': 'طارم', 'left': 0.657258064516129, 'top': 0.29572649572649573, 'width': 0.03306451612903226, 'height': 0.012535612535612535},
    {'text': 'محلی', 'left': 0.6153225806451613, 'top': 0.29572649572649573, 'width': 0.035483870967741936, 'height': 0.013105413105413105},
    {'text': 'عکس', 'left': 0.65, 'top': 0.31851851851851853, 'width': 0.035483870967741936, 'height': 0.011396011396011397},
    {'text': 'تصاویر', 'left': 0.6, 'top': 0.31851851851851853, 'width': 0.042741935483870966, 'height': 0.011396011396011397},
    {'text': '(', 'left': 0.5862903225806452, 'top': 0.31851851851851853, 'width': 0.007258064516129033, 'height': 0.011396011396011397},
    {'text': '۷۲', 'left': 0.5758064516129032, 'top': 0.31851851851851853, 'width': 0.017741935483870968, 'height': 0.011396011396011397},
    {'text': '۷۳', 'left': 0.5491935483870968, 'top': 0.31851851851851853, 'width': 0.018548387096774192, 'height': 0.011396011396011397},
    {'text': '۷۴', 'left': 0.521774193548387, 'top': 0.31851851851851853, 'width': 0.018548387096774192, 'height': 0.011396011396011397},
    {'text': 'و', 'left': 0.5088709677419355, 'top': 0.31851851851851853, 'width': 0.008870967741935484, 'height': 0.011396011396011397},
    {'text': '۷۵', 'left': 0.4854838709677419, 'top': 0.31851851851851853, 'width': 0.01935483870967742, 'height': 0.011396011396011397},
    {'text': 'موتانت', 'left': 0.4661290322580645, 'top': 0.3367521367521368, 'width': 0.029838709677419355, 'height': 0.009116809116809116},
    {'text': 'موسی', 'left': 0.43629032258064515, 'top': 0.3373219373219373, 'width': 0.025806451612903226, 'height': 0.008547008547008548},
    {'text': 'طارم', 'left': 0.4129032258064516, 'top': 0.3373219373219373, 'width': 0.01935483870967742, 'height': 0.009116809116809116},
    {'text': 'موتانت', 'left': 0.3620967741935484, 'top': 0.3378917378917379, 'width': 0.02903225806451613, 'height': 0.009116809116809116},
    {'text': 'طارم', 'left': 0.3379032258064516, 'top': 0.3378917378917379, 'width': 0.020161290322580645, 'height': 0.009116809116809116},
    {'text': 'محلی', 'left': 0.31048387096774194, 'top': 0.3378917378917379, 'width': 0.02338709677419355, 'height': 0.009116809116809116},
    {'text': '(', 'left': 0.32983870967741935, 'top': 0.3504273504273504, 'width': 0.00564516129032258, 'height': 0.007407407407407408},
    {'text': 'T', 'left': 0.3338709677419355, 'top': 0.3504273504273504, 'width': 0.008870967741935484, 'height': 0.007407407407407408},
    {'text': '-', 'left': 0.3419354838709677, 'top': 0.3504273504273504, 'width': 0.00564516129032258, 'height': 0.007407407407407408},
    {'text': '9', 'left': 0.34758064516129034, 'top': 0.3504273504273504, 'width': 0.0064516129032258064, 'height': 0.007407407407407408},
    {'text': '-', 'left': 0.3540322580645161, 'top': 0.3504273504273504, 'width': 0.0064516129032258064, 'height': 0.007407407407407408},
    {'text': '**', 'left': 0.3596774193548387, 'top': 0.3504273504273504, 'width': 0.008870967741935484, 'height': 0.007407407407407408},
    {'text': ')', 'left': 0.36612903225806454, 'top': 0.3504273504273504, 'width': 0.00564516129032258, 'height': 0.007407407407407408},
    {'text': '(', 'left': 0.42338709677419356, 'top': 0.350997150997151, 'width': 0.004838709677419355, 'height': 0.0062678062678062675}
]

# مرتب‌سازی کلمات بر اساس مقدار `top`
sorted_data = sorted(data, key=lambda x: x['top'])

# گروه‌بندی کلمات بر اساس نزدیکی `top`
lines = []
current_line = []
current_top = sorted_data[0]['top']

threshold = 0.01  # آستانه برای تشخیص خطوط (بسته به نیاز تنظیم کنید)

for word in sorted_data:
    if abs(word['top'] - current_top) < threshold:
        current_line.append(word['text'])
    else:
        lines.append(current_line)
        current_line = [word['text']]
        current_top = word['top']

if current_line:
    lines.append(current_line)

# نمایش خطوط مرتب شده
for line in lines:
    print(" ".join(line))