Поместите все элементы в форме dict, которые имеют одинаковое имя - PullRequest
1 голос
/ 25 марта 2019

У меня есть список, такой как:

list=["Chrm_23-56_python_regius","Chrm_3-89_elephant_regius",
      "Chrm_13-56_monkey_regius","Chrm_13-34_rat_regius","Chrm_67-123_python_regius",
      "chrm_90-345_elephant_regius","Chrm_67-124_monkey_regius",
      "Chrm_345-456_rat_regius","Chrm_789-1000_python_regius"]

, и идея состоит в том, чтобы поместить все элементы в форму dict с одинаковыми именами (без number-number). и получить что-то вроде:

dict = {'key1': ['Chrm_23-56_python_regius','Chrm_67-123_python_regius','Chrm_789-1000_python_regius'],
        'key2': ['Chrm_3-89_elephant_regius','chrm_90-345_elephant_regius'],
        'key3': ['Chrm_13-56_monkey_regius','Chrm_67-124_monkey_regius'],
        'key4': ['Chrm_13-34_rat_regius','Chrm_345-456_rat_regius']}

Как вы можете видеть, например, в key1 3 значения (без номера-числа): от = до Chrm__python_regius.

Я знаю, как увидеть, какой элемент одинаков без части number-number, выполнив:

for i in list:
    print(re.sub(r'[\d]+[-]+[\d]+', '',i)

Но я не знаю, как создать dict и добавить в те же ключи значения, которые имеют одинаковую структуру имени. У кого-нибудь есть идея?

Ответы [ 2 ]

5 голосов
/ 25 марта 2019

Использование регулярного выражения: -> re.sub(r"\d*\-\d*", "", i)

Пример:

import re
from collections import defaultdict
lst=["Chrm_23-56_python_regius","Chrm_3-89_elephant_regius","Chrm_13-56_monkey_regius","Chrm_13-34_rat_regius","Chrm_67-123_python_regius","chrm_90-345_elephant_regius","Chrm_67-124_monkey_regius","Chrm_345-456_rat_regius","Chrm_789-1000_python_regius"]

result = defaultdict(list)
for i in lst:
    result[re.sub(r"\d*\-\d*", "", i)].append(i)
print(result)

Выход:

defaultdict(<type 'list'>, {'Chrm__elephant_regius': ['Chrm_3-89_elephant_regius'], 'Chrm__python_regius': ['Chrm_23-56_python_regius', 'Chrm_67-123_python_regius', 'Chrm_789-1000_python_regius'], 'Chrm__monkey_regius': ['Chrm_13-56_monkey_regius', 'Chrm_67-124_monkey_regius'], 'Chrm__rat_regius': ['Chrm_13-34_rat_regius', 'Chrm_345-456_rat_regius'], 'chrm__elephant_regius': ['chrm_90-345_elephant_regius']})
2 голосов
/ 25 марта 2019

Использование itertools.groupby:

import itertools

func = lambda x:x.split('_')[-2]
l = sorted(l, key=func)
d = {'key%s' % i: list(g) for i, (k,g) in enumerate(itertools.groupby(l, func))}
{'key0': ['Chrm_3-89_elephant_regius', 'chrm_90-345_elephant_regius'],
 'key1': ['Chrm_13-56_monkey_regius', 'Chrm_67-124_monkey_regius'],
 'key2': ['Chrm_23-56_python_regius',
  'Chrm_67-123_python_regius',
  'Chrm_789-1000_python_regius'],
 'key3': ['Chrm_13-34_rat_regius', 'Chrm_345-456_rat_regius']}

Примечание:

  • func part создает функцию, которая извлекает нужный ключ из каждого элемента данного iterable.
  • itertools.groupby предполагает, что iterable является отсортированным .Таким образом, sorted или list.sort необходимы перед его использованием.
  • itertools.groupby затем возвращает сгруппированный объект.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...