我有一个列表,例如:
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
并在相同的键中添加具有相同名称结构的值。有人有主意吗?
答案 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
已已排序。因此,sorted
或list.sort
在使用之前是必需的。itertools.groupby
然后返回分组的对象。