Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > Python
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.09.2024, 09:24   #1
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,119
По умолчанию Объединение строк

в списке после сортировки:
Код:
out_replace = sorted(out_replace)
могут быть строки идущие друг за другом
"what": "-19", "count": "1", "wht": "COVID-19",
"what": "-19", "count": "1", "wht": "КОВИД-19",
их может быть две и более так как значение "what" у них одинаковое = "-19"
как их объединить, в данном случае и увеличить значение count = 2
"what": "-19", "count": "2", "wht": ["COVID-19", "КОВИД-19"],
и значение в квадратных скобках [] должно быть отсортировано по алфавиту
Ципихович Эндрю вне форума Ответить с цитированием
Старый 24.09.2024, 09:47   #2
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,119
По умолчанию

сложность для меня заключается в том, что список out_replace мне далее нужен будет и значит нужно в нём две строки:
"what": "-19", "count": "1", "wht": "COVID-19",
"what": "-19", "count": "1", "wht": "КОВИД-19",
удалить и заменить на строку:
"what": "-19", "count": "2", "wht": ["COVID-19", "КОВИД-19"],
Ципихович Эндрю вне форума Ответить с цитированием
Старый 24.09.2024, 14:19   #3
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,342
По умолчанию

А точно замены нужно хранить в виде строк, а не, например, словаря?
Код:
from collections import defaultdict

out_replace = [
    '"what": "-19", "count": "1", "wht": "COVID-19",',
    '"what": "-19", "count": "1", "wht": "КОВИД-19",'
]

out_replace_dict = defaultdict(list)
for line in out_replace:
    values = line.split('"')[1::2]
    what = values[1]
    wht = values[5]
    out_replace_dict[what].append(wht)
print(out_replace_dict)

# можно опять превратить в строки
new_out_replace = [
    '"what": "%s", "count": "%d", "wht": %s,' % (what, len(wht), '"' + wht[0] + '"' if len(wht) == 1 else '["' + '", "'.join(sorted(wht)) + '"]') for what, wht in sorted(out_replace_dict.items())
]
print(new_out_replace)
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 24.09.2024, 14:26   #4
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,119
По умолчанию

спасибо, справился
Код:
out_replace = sorted(out_replace)
out_res = []
temp = {}
for e in out_replace:
    # в данных могут быть экранированные знаки '"' - '\"' поэтому split('"') лучше не использовать
    match = re.search(r'"what":\s*"([^"]+)",\s*"count":\s*"([^"]+)",\s*"wht":\s*"([^"]+)"', e)
    if match:
        what, count, wht = match.groups()
        if what in temp:
            temp[what].append(wht)
        else:
            temp[what] = [wht]
for what, whts in temp.items():
    whts_str = ', '.join(f'"{w}"' for w in whts)
    if len(whts) == 1:
        ee = f'"what": "{what}", "count": "{len(whts)}", "wht": {whts_str},'  # без квадратных скобок для одного значения
    else:
        ee = f'"what": "{what}", "count": "{len(whts)}", "wht": [{whts_str}],'  # с квадратными скобками для нескольких значений
    out_res.append(ee)
print(*out_res, sep='\n') # извлечение данных со списка, код в одну строку
но до случая пока всё хорошо - как поломается я со временем и в своём коде плаваю....
Ципихович Эндрю вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
объединение строк в диапазон строк eko_knopka C# (си шарп) 0 05.10.2017 12:50
объединение строк tutejshy Общие вопросы C/C++ 0 17.07.2017 22:21
Объединение строк с++ AnnaKom Помощь студентам 2 12.01.2012 16:26
Объединение строк fox31 Microsoft Office Excel 1 31.03.2011 17:35
объединение строк Silipin Microsoft Office Excel 2 28.10.2009 14:19