如果你真的经常使用这样的语句,并且想要代码的最大灵活性和可重用性而不是经常编写这样的模式,我建议为它创建一个小函数。只需将其放入某个模块并导入即可(您甚至可以导入我创建的脚本)。
有关用法示例,请参阅if __name__=="__main__" 块。诀窍是使用组 ID 列表将 t 的值组合在一起。这个id列表的长度至少应该和t的长度一样。
我只会解释主要的概念,如果你有什么不懂的,尽管问。
我使用来自 itertools 的 groupby。尽管在这里如何使用它可能并不简单,但我希望它很快就会被理解。
作为key-function,我使用了一种通过工厂函数动态创建的方法。这里的主要概念是“闭包”。组 ID 列表被“附加”到内部函数 get_group。因此:
除此之外,我还有一个简单的方法可以从groupby 返回的组中创建列表或标量。
就是这样。
from itertools import groupby
def extract_groups_from_iterable(iterable, group_ids):
return [_make_list_or_scalar(g) for k, g in
groupby(iterable, _get_group_id_provider(group_ids))
]
def _get_group_id_provider(group_ids):
def get_group(value, group_ids = group_ids):
return group_ids.pop(0)
return get_group
def _make_list_or_scalar(iterable):
list_ = list(iterable)
return list_ if len(list_) != 1 else list_[0]
if __name__ == "__main__":
t1 = range(9)
group_ids1 = [1,2,3,4,5,5,6,7,8]
a,b,c,d,e,f,g,h = extract_groups_from_iterable(t1, group_ids1)
for varname in "abcdefgh":
print varname, globals()[varname]
print
t2 = range(15)
group_ids2 = [1,2,2,3,4,5,5,5,5,5,6,6,6,7,8]
a,b,c,d,e,f,g,h = extract_groups_from_iterable(t2, group_ids2)
for varname in "abcdefgh":
print varname, globals()[varname]
输出是:
a 0
b 1
c 2
d 3
e [4, 5]
f 6
g 7
h 8
a 0
b [1, 2]
c 3
d 4
e [5, 6, 7, 8, 9]
f [10, 11, 12]
g 13
h 14
再一次,这似乎有点矫枉过正,但如果这有助于您减少代码,请使用它。