将所有具有相同名称的元素放入dict形式

时间:2019-03-25 08:51:09

标签: python regex

我有一个列表,例如:

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 个答案:

答案 0 :(得分:5)

使用正则表达式:-> 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']})

答案 1 :(得分:2)

使用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部分创建了一个函数,该函数从给定的iterable的每个元素中提取所需的键。
  • itertools.groupby假设iterable已排序。因此,sortedlist.sort在使用之前是必需的。
  • itertools.groupby然后返回分组的对象。