Группировать строки в списке с помощью регулярных выражений - PullRequest
1 голос
/ 08 апреля 2020

Я пытаюсь использовать регулярные выражения для группировки элементов по сходству, поэтому вместо большого количества элементов я могу сгруппировать их так, чтобы их было гораздо меньше. Но это не работает, как ожидалось, и дает неправильный вывод. ниже ожидаемый вывод и мой текущий выход.

Пример mini: 'k1', 'k2', 'k3', 'k4' -> 'k(1|2|3|4)'

Фактический код:

import re

loc_list = [
    'phone100-500-cas-ras9-f51-s10-k2',
    'phone100-500-cas-ras9-f52-s10-k2',
    'phone100-500-cas-ras9-f50-s10-k2',
    'phone100-500-cas-ras9-f50-s9-k3',
    'phone100-500-cas-ras9-f50-s9-k1',
    'Telephone100-500-cas-ras9-f50-s9-k2']

split_loc_list = [phone.split("-") for phone in loc_list]

locs = {}

for loc in split_loc_list:
    locs.setdefault("-".join(loc[0:4]), {}).\
                        setdefault("f", set()).add(loc[4].strip("f"))
    locs.setdefault("-".join(loc[0:4]), {}).\
                        setdefault("s", set()).add(loc[5].strip("s"))
    locs.setdefault("-".join(loc[0:4]), {}).\
                        setdefault("k", set()).add(loc[6].strip("k"))
prove = []
for loc, vals in locs.items():
    f_vals_sorted = sorted(list(map(int, vals["f"])))
    f_vals_joined = "|".join(map(str, f_vals_sorted))
    if "|" in f_vals_joined:
        f_vals_joined = f"({f_vals_joined})"
    s_vals_sorted = sorted(list(map(int, vals["s"])))
    s_vals_joined = "|".join(map(str, s_vals_sorted))
    if "|" in s_vals_joined:
        s_vals_joined = f"({s_vals_joined})"
    k_vals_sorted = sorted(list(map(int, vals["k"])))
    k_vals_joined = "|".join(map(str, k_vals_sorted))
    if "|" in k_vals_joined:
        k_vals_joined = f"({k_vals_joined})"
    prove.append(f"{loc}-f{f_vals_joined}-s{s_vals_joined}-k{k_vals_joined}")
print("|".join(prove))

Токовый выход, который является неправильным:

phone100-500-cas-ras9-f(50|51|52)-s(9|10)-k(1|2|3)|Telephone100-500-cas-ras9-f50-s9-k2

Ожидаемый результат:

Telephone100-500-cas-ras9-f50-s9-k2|phone100-500-cas-ras9-f50-s9-k(1|3)|phone100-500-cas-ras9-f(50|51|52)-s10-k2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...