сформировать словарь из строки

robisho

Активный пользователь
Пользователь
Окт 19, 2020
151
26
28
Добрый день. Есть список словарей
[{'1-75 мин — Тотал (2) бол': '1.52'}, {'ФК Лос Анджелес победа и тотал (2.5) мен -4.5 ФК Лос Анджелес победа и тотал (2.5) бол -1.88': '4.5'}, {'Тотал (3.5) мен -1.62 Тотал (3.5) бол -2': '1.62'}]
Нужно, если ключ включает в себя и 'мен' and 'бол' (т.е. первый словарь не трогаем, а второй и третий словарь попадают), разбить ключ на две части и получить вместо одного
{'ФК Лос Анджелес победа и тотал (2.5) мен -4.5 ФК Лос Анджелес победа и тотал (2.5) бол -1.88': '4.5'}
два словаря {'ФК Лос Анджелес победа и тотал (2.5) мен': '4.5'} и {'ФК Лос Анджелес победа и тотал (2.5) бол: '4.5' }. Спасибо.
 
Последнее редактирование:

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Вот обновленный пример (значения словарей берутся из строки ключа):
Python:
import re

# список словарей
list_of_dicts = [{'1-75 мин — Тотал (2) бол': '1.52'},
     {'ФК Лос Анджелес победа и тотал (2.5) мен -4.5 ФК Лос Анджелес победа и тотал (2.5) бол -1.88': '4.5'},
     {'Тотал (3.5) мен -1.62 Тотал (3.5) бол -2.15': '1.62'},
     {'Тотал (3.5) мен -1 Тотал (3.5) бол -2': '1.62'},]

# регулярки для поиска
p1 = re.compile(r'.*мен')
p2 = re.compile(r'(?<=мен)(\W+\w+.\d+|\W+\w+)\s(.*бол)')
p3 = re.compile(r'(?<=мен)(\W+\w+.\d+|\W+\w+)')
p4 = re.compile(r'(?<=бол)(\W+\w+.\d+|\W+\w+)')

# новый список словарей
list_of_dicts2 = []
# проходим по списку словарей в цикле
for dict_ in list_of_dicts:
    # проходим по каждому словарю в цикле
    for key, value in dict_.items():
        # если в ключе есть 'мен' и 'бол'
        if 'мен' in key and 'бол' in key:
            part1 = p1.search(key)  # получаем первую часть ключа
            part2 = p2.search(key)  # получаем вторую часть ключа
            part3 = p3.search(key)  # получаем значение мен
            part4 = p4.search(key)  # получаем значение бол

            list_of_dicts2.append({part1.group(0): abs(float(part3.group()))})
            list_of_dicts2.append({part2.group(2): abs(float(part4.group()))})
        
        # если в ключе нет 'мен' и 'бол'
        else:
            # добавляем в список словарь
            list_of_dicts2.append(dict_)

# выводим новый список в консоль
for i in list_of_dicts2:
    print(i)
 
  • Мне нравится
Реакции: Student и robisho

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Вот пример:
Python:
# список словарей
list_of_dicts = [{'1-75 мин — Тотал (2) бол': '1.52'},
     {'ФК Лос Анджелес победа и тотал (2.5) мен -4.5 ФК Лос Анджелес победа и тотал (2.5) бол -1.88': '4.5'},
     {'Тотал (3.5) мен -1.62 Тотал (3.5) бол -2.15': '1.62'}]

# регулярки для поиска
p1 = re.compile(r'.*мен')
p2 = re.compile(r'(?<=мен)\W+\w+.\w+\s(.*бол)')

# новый список словарей
list_of_dicts2 = []
# проходим по списку словарей в цикле
for dict_ in list_of_dicts:
    # проходим по каждому словарю в цикле
    for key, value in dict_.items():
        # если в ключе есть 'мен' и 'бол'
        if 'мен' in key and 'бол' in key:
            part1 = p1.search(key)  # получаем первую часть ключа
            part2 = p2.search(key)  # получаем вторую часть ключа
            # создаем словари и добавляем их в новый список
            list_of_dicts2.append({part1.group(): value})
            list_of_dicts2.append({part2.group(1): value})
        # если в ключе нет 'мен' и 'бол'
        else:
            # добавляем в список словарь
            list_of_dicts2.append(dict_)

# выводим новый список в консоль
for i in list_of_dicts2:
    print(i)
 
  • Мне нравится
Реакции: Student и robisho

robisho

Активный пользователь
Пользователь
Окт 19, 2020
151
26
28
в принципе сделал вот так
Python:
data = [{'Сан-Франциско Джайентс (1.5) мен -2.35  Сан-Франциско Джайентс (1.5) бол -1.45': '2.35'}, {'Лос-Анджелес Доджерс (6.5) мен -2.9  Лос-Анджелес Доджерс (6.5) бол -1.62': '2'}, {'П1 в 4-м иннинге': '4.25'}, {'П1 и тотал  (7.5) мен -4.8  П1 и тотал  (7.5) бол -2.6': '4.8'}, {'П2 и тотал  (7.5) мен -4.05  П2 и тотал  (7.5) бол -2.9': '4.05'}, {'Лос-Анджелес Энджелс победа и тотал (8.5) мен -3.75  Лос-Анджелес Энджелс победа и тотал (8.5) бол -2.55': '3.0'},]

def get_pair_keys(string):
    pattern = re.compile(r'-\d+\.\d+')
    str_list = string.split()
    koef_l = []
    for i, s in enumerate(str_list):
        a = re.findall(pattern, s)
        if a:
            a = a[0].replace('-', '')
            data = (i, a)
            koef_l.append(data)
    # print(koef_l)

    data1, data2 = {}, {}

    ind1 = koef_l[0][0]
    ind2 = koef_l[1][0]

    k1 = str_list[:ind1]
    k1 = ' '.join(k1)
    data1[k1] = koef_l[0][1]


    k2 = str_list[ind1+1:-1]
    k2 = ' '.join(k2)
    data2[k2] = koef_l[1][1]

    return (data1, data2)


for d in data:
    for key, val in d.items():
        if ('мен' in key) and ('бол' in key):
            string = get_pair_keys(key)
            print(string)


вот только это работает, если ключ float, если int - то падает. дело в регулярке. может кто силен - по-быстрому подскажут)
 
  • Мне нравится
Реакции: Student

robisho

Активный пользователь
Пользователь
Окт 19, 2020
151
26
28
Вот пример:
Python:
# список словарей
list_of_dicts = [{'1-75 мин — Тотал (2) бол': '1.52'},
     {'ФК Лос Анджелес победа и тотал (2.5) мен -4.5 ФК Лос Анджелес победа и тотал (2.5) бол -1.88': '4.5'},
     {'Тотал (3.5) мен -1.62 Тотал (3.5) бол -2.15': '1.62'}]

# регулярки для поиска
p1 = re.compile(r'.*мен')
p2 = re.compile(r'(?<=мен)\W+\w+.\w+\s(.*бол)')

# новый список словарей
list_of_dicts2 = []
# проходим по списку словарей в цикле
for dict_ in list_of_dicts:
    # проходим по каждому словарю в цикле
    for key, value in dict_.items():
        # если в ключе есть 'мен' и 'бол'
        if 'мен' in key and 'бол' in key:
            part1 = p1.search(key)  # получаем первую часть ключа
            part2 = p2.search(key)  # получаем вторую часть ключа
            # создаем словари и добавляем их в новый список
            list_of_dicts2.append({part1.group(): value})
            list_of_dicts2.append({part2.group(1): value})
        # если в ключе нет 'мен' и 'бол'
        else:
            # добавляем в список словарь
            list_of_dicts2.append(dict_)

# выводим новый список в консоль
for i in list_of_dicts2:
    print(i)
Спасибо за помощь. Но ваш вариант тоже падает, если значение коэффициента int)

пысы. прошу прощения, не все int вызывают падение, только цифры, 100 не роняет, а 1 - да

pss получается, ошибка возникает, если мен -2 только, мен -2.35, мен -100 и бол -2 работает
 
Последнее редактирование:

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
вариант тоже падает, если значение коэффициента int)
Можно немного изменить регулярку и падать не будет:
Python:
p2 = re.compile(r'(?<=мен)(\W+\w+.\d+|\W+\w+)\s(.*бол)')
 
  • Мне нравится
Реакции: robisho

robisho

Активный пользователь
Пользователь
Окт 19, 2020
151
26
28
Можно немного изменить регулярку и падать не будет:
Python:
p2 = re.compile(r'(?<=мен)(\W+\w+.\d+|\W+\w+)\s(.*бол)')
я прошу прощения за свою невнимательность, дело в том, что нужно
получить вместо {'ФК Лос Анджелес победа и тотал (2.5) мен -4.5 ФК Лос Анджелес победа и тотал (2.5) бол -1.88': '4.5'}
два словаря {'ФК Лос Анджелес победа и тотал (2.5) мен': '4.5'} и {'ФК Лос Анджелес победа и тотал (2.5) бол: '1.88' } , а получается с регуляркой
p2 = re.compile(r'(?<=мен)\W+\w+.\w+\s(.*бол)') , что везде value == 4.5. а при новой регулярке p2 = re.compile(r'(?<=мен)(\W+\w+.\d+|\W+\w+)\s(.*бол)') получается
Код:
{'1-75 мин — Тотал (2) бол': '1.52'}
{'ФК Лос Анджелес победа и тотал (2.5) мен': '4.5'}
{' -4': '4.5'}
{'Тотал (3.5) мен': '1.62'}
{' -1.62': '1.62'}
 

Форум IT Специалистов