Сгруппировать список строк с одинаковым суффиксом

У меня есть такая структура папок:

exp_name_seed_$INT/$STR_1
exp_name_seed_$INT/$STR_2
exp_name_seed_$INT/$STR_3
exp_name_seed_$INT/$STR_4
exp_name_seed_$INT/$STR_5

exp_name1_seed_$INT/$STR_1
exp_name1_seed_$INT/$STR_2
exp_name1_seed_$INT/$STR_3
exp_name1_seed_$INT/$STR_4
exp_name1_seed_$INT/$STR_5

Я хотел бы сгруппировать это в структурированных данных (например, в словаре) следующим образом:

-exp_name
-- exp_name_seed_$INT/$STR_1
-- exp_name_seed_$INT/$STR_2
-- exp_name_seed_$INT/$STR_3
-- exp_name_seed_$INT/$STR_4
-- exp_name_seed_$INT/$STR_5
-exp_name1
-- exp_name1_seed_$INT/$STR_1
-- exp_name1_seed_$INT/$STR_2
-- exp_name1_seed_$INT/$STR_3
-- exp_name1_seed_$INT/$STR_4
-- exp_name1_seed_$INT/$STR_5

Учтите, что на данный момент exp_name имеет переменный размер, но окончание имеет одинаковую структуру _seed_$INT/$STR_1

Есть ли какой-нибудь эффективный способ в python для достижения этой функциональности?

это осуществимо ... и показать свои усилия

RomanPerekhrest 01.07.2019 11:22
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
1
211
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вот один из способов сделать это, т.е. создать словарь для хранения ваших данных. Прокрутите список ввода, возьмите нужные подстроки и создайте словарные записи.

ls=["exp_name_seed_$INT/$STR_1",
"exp_name_seed_$INT/$STR_2",
"exp_name_seed_$INT/$STR_3",
"exp_name_seed_$INT/$STR_4",
"exp_name_seed_$INT/$STR_5",
"exp_name1_seed_$INT/$STR_1",
"exp_name1_seed_$INT/$STR_2",
"exp_name1_seed_$INT/$STR_3",
"exp_name1_seed_$INT/$STR_4",
"exp_name1_seed_$INT/$STR_5"]

postfix_len=len("seed_$INT/$STR_N") # assume length is fixed

result_dict = {}
for item in ls:
    body_len=len(item)-postfix_len # this length will vary

    body=item[:body_len-1] # get for example "exp_name"
    postfix=item[body_len+5:len(item)] # get for example "$INT/$STR_3"

    if result_dict.get(body):
        result_dict[body].append(postfix) #if entry exists, add to list
    else:
        result_dict[body]=[postfix] # if entry doesn't exist yet, create list


print(result_dict)

Мы не можем предположить, что постфикс имеет одинаковую длину :( Потому что $INT и $STR_N могут иметь разные размеры из-за того, что количество цифр целых чисел может быть больше 9.

Dhorka 01.07.2019 11:33

Вместо len(item)-postfix_len используйте find, чтобы получить позицию подстроки _seed_ - это ваш новый body_len. ;)

h4z3 01.07.2019 11:38

Достаточно справедливо, но ваш вопрос, похоже, предполагает, что длина постфикса фиксирована.

Karl 01.07.2019 12:54
Ответ принят как подходящий

Конечно, такие вещи в python довольно просты. Читайте о мощных groupby и setdefault

from itertools import groupby

ls=["exp_name_seed_$INT/$STR_1",
"exp_name_seed_$INT/$STR_2",
"exp_name_seed_$INT/$STR_3",
"exp_name_seed_$INT/$STR_4",
"exp_name_seed_$INT/$STR_5",
"exp_name1_seed_$INT/$STR_1",
"exp_name1_seed_$INT/$STR_2",
"exp_name1_seed_$INT/$STR_3",
"exp_name1_seed_$INT/$STR_4",
"exp_name1_seed_$INT/$STR_5"]

result = {}
for key, val in groupby(ls, lambda s: s.split('_seed_', 1)[0]):
    result.setdefault(key, []).extend(val)

print(result)

испускает

{'exp_name': ['exp_name_seed_$INT/$STR_1',
  'exp_name_seed_$INT/$STR_2',
  'exp_name_seed_$INT/$STR_3',
  'exp_name_seed_$INT/$STR_4',
  'exp_name_seed_$INT/$STR_5'],
 'exp_name1': ['exp_name1_seed_$INT/$STR_1',
  'exp_name1_seed_$INT/$STR_2',
  'exp_name1_seed_$INT/$STR_3',
  'exp_name1_seed_$INT/$STR_4',
  'exp_name1_seed_$INT/$STR_5']}

Другие вопросы по теме