3 回答

TA贡献1804条经验 获得超8个赞
from collections import defaultdict
from pprint import pprint
all_templates = ['fitting_file_expdisk_cutout-IMG-HSC-I-18115-6,3-OBJ-NEP175857.9+655841.2.feedme', 'fitting_file_sersic_cutout-IMG-HSC-I-18115-3,3-OBJ-NEP180508.6+655617.3.feedme', 'fitting_file_sersic_cutout-IMG-HSC-I-18115-1,8-OBJ-NEP180840.8+665226.2.feedme', 'fitting_file_sersic_cutout-IMG-HSC-I-18115-6,7-OBJ-NEP175927.6+664230.2.feedme', 'fitting_file_expdisk_cutout-IMG-HSC-I-18114-0,5-OBJ-zsel56238.feedme', 'fitting_file_devauc_cutout-IMG-HSC-I-18114-0,3-OBJ-NEP175616.1+660601.5.feedme', 'fitting_file_sersic_cutout-IMG-HSC-I-18115-6,4-OBJ-zsel56238.feedme']
# simple helper function to extract the common object name
# you could probably use Regex... but then you'd have 2 problems
def objectName(path):
start = path.index('-OBJ-')
stop = path.index('.feedme')
return path[(start + 5):stop]
# I really wanted to use a one line reduce here, but...
grouped = defaultdict(list)
for each in all_templates:
grouped[objectName(each)].append(each)
pprint(grouped)
侧面/切线
好吧,我不能在reduce那里做一个简单的衬里,这真的让我感到烦恼。最后,希望python有一个好的groupby功能。它具有该名称的功能,但仅限于连续键。Smalltalk、Objc 和 Swift 都具有 groupby 机制,基本上允许您通过任意传递函数对可发音进行分桶。
我最初的尝试看起来像:
grouped = reduce(
lambda accum, each: accum[objectName(each)].append(each),
all_templates,
defaultdict(list))
问题是拉姆达。lambda 仅限于单个表达式。为了让它在 reduce 中工作,它最多返回累积参数的修改版本。但是除非必须,python 不喜欢从函数/方法返回东西。即使我们更换了append用<accessTheCurrentList> + [each],我们需要一本字典修饰方法更新在关键值,返回修改后的字典。我找不到这样的东西。
但是,我们可以做的是将更多信息加载到我们的累加器中,例如元组。我们可以使用元组的一个槽来继续传递 defaultdict 指针,另一个来捕获修改操作的无用 None 返回。它最终非常丑陋,但它是一个单线:
from functools import reduce
grouped = reduce(
lambda accum, each: (accum[0], accum[0][objectName(each)].append(each)),
all_templates,
(defaultdict(list), None))[0]

TA贡献1780条经验 获得超1个赞
您可以对排序列表进行分组:
from itertools import groupby
import re
all_templates = ['fitting_file_expdisk_cutout-IMG-HSC-I-18115-6,3-OBJ-NEP175857.9+655841.2.feedme', 'fitting_file_sersic_cutout-IMG-HSC-I-18115-3,3-OBJ-NEP180508.6+655617.3.feedme', 'fitting_file_sersic_cutout-IMG-HSC-I-18115-1,8-OBJ-NEP180840.8+665226.2.feedme', 'fitting_file_sersic_cutout-IMG-HSC-I-18115-6,7-OBJ-NEP175927.6+664230.2.feedme', 'fitting_file_expdisk_cutout-IMG-HSC-I-18114-0,5-OBJ-zsel56238.feedme', 'fitting_file_devauc_cutout-IMG-HSC-I-18114-0,3-OBJ-NEP175616.1+660601.5.feedme', 'fitting_file_sersic_cutout-IMG-HSC-I-18115-6,4-OBJ-zsel56238.feedme']
pattern = re.compile(r'OBJ-.*?\.feedme$')
objs = {name: pattern.search(name)[0] for name in all_templates}
result = [list(g) for k, g in groupby(sorted(all_templates, key=objs.get), key=objs.get)]
print(result)
输出:
[['fitting_file_devauc_cutout-IMG-HSC-I-18114-0,3-OBJ-NEP175616.1+660601.5.feedme'],
['fitting_file_expdisk_cutout-IMG-HSC-I-18115-6,3-OBJ-NEP175857.9+655841.2.feedme'],
['fitting_file_sersic_cutout-IMG-HSC-I-18115-6,7-OBJ-NEP175927.6+664230.2.feedme'],
['fitting_file_sersic_cutout-IMG-HSC-I-18115-3,3-OBJ-NEP180508.6+655617.3.feedme'],
['fitting_file_sersic_cutout-IMG-HSC-I-18115-1,8-OBJ-NEP180840.8+665226.2.feedme'],
['fitting_file_expdisk_cutout-IMG-HSC-I-18114-0,5-OBJ-zsel56238.feedme',
'fitting_file_sersic_cutout-IMG-HSC-I-18115-6,4-OBJ-zsel56238.feedme']]
添加回答
举报