このようなステートメントを頻繁に使用し、そのようなパターンを頻繁に記述するのではなく、コードの柔軟性と再利用性を最大限に高めたい場合は、そのための小さな関数を作成することをお勧めします。モジュールに入れてインポートするだけです(作成したスクリプトをインポートすることもできます)。
使用例については、if __name__=="__main__"
ブロックを参照してください。秘訣は、グループIDのリストを使用しての値をグループ化するt
ことです。このIDリストの長さは、少なくとも。の長さと同じである必要がありt
ます。
主な概念のみを説明します。何もわからない場合は、質問してください。
groupby
itertoolsから使用します。ここでの使い方は簡単ではないかもしれませんが、すぐに理解できると思います。
関数としてkey
、ファクトリ関数を介して動的に作成するメソッドを使用します。ここでの主なコンセプトは「クロージャ」です。グループ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
繰り返しになりますが、これはやり過ぎのように思えるかもしれませんが、これがコードの削減に役立つ場合は、それを使用してください。