2

フォームのリストが1つあります。

>>> my_list = ['BLA1', 'BLA2', 'BLA3', 'ELE1', 'ELE2', 'ELE3', 'PRI1', 'PRI2', 'NEA1', 'NEA2', 'MAU1', 'MAU2', 'MAU3']

そして、新しいリストを作成し、繰り返される要素を新しいリスト内のリストにグループ化するので、最後に次のようになります。

>>> new_list = [['BLA1', 'BLA2', 'BLA3'], ['ELE1', 'ELE2', 'ELE3'], ['PRI1', 'PRI2'], ['NEA1', 'NEA2'], ['MAU1', 'MAU2', 'MAU3']]
4

3 に答える 3

6

使用itertools.groupby

import itertools

[list(group) for key, group in itertools.groupby(my_list, key=lambda v: v[:3])]

ここでは、グループ化するkey値の一部だけを抽出するために引数が必要です。最初の3文字。

結果:

>>> my_list = ['BLA1', 'BLA2', 'BLA3', 'ELE1', 'ELE2', 'ELE3', 'PRI1', 'PRI2', 'NEA1', 'NEA2', 'MAU1', 'MAU2', 'MAU3']
>>> [list(group) for key, group in itertools.groupby(my_list, key=lambda v: v[:3])]
[['BLA1', 'BLA2', 'BLA3'], ['ELE1', 'ELE2', 'ELE3'], ['PRI1', 'PRI2'], ['NEA1', 'NEA2'], ['MAU1', 'MAU2', 'MAU3']]

groupby等しい連続するキーを1つのグループに結合します。互いに素なグループがある場合(同じ値ですが、間に他の値があります)、それらに対して個別のグループが作成されます。

>>> my_list = ['a1', 'a2', 'b1', 'b2', 'a3', 'a4']
>>> [list(group) for key, group in itertools.groupby(my_list)]
[['a1', 'a2'], ['b1', 'b2'], ['a3', 'a4']]

それがあなたが望むものでない場合は、my_list最初にソートする必要があります。

于 2013-03-26T13:06:56.473 に答える
1

並べ替えて使用することを確認してください

itertools.groupy
于 2013-03-26T13:06:05.543 に答える
1

groupbyの代わりに、次を使用できますcollections.Counter

In [40]: from collections import Counter

In [41]: [ [k]*v for (k,v) in Counter(my_list).iteritems() ]
Out[41]: 
[['PRI', 'PRI'],
 ['NEA', 'NEA'],
 ['BLA', 'BLA', 'BLA'],
 ['MAU', 'MAU', 'MAU'],
 ['ELE', 'ELE', 'ELE']]

groupbyとは異なり、要素がすべて乱雑になっている場合、これはリストを並べ替える必要なしに機能します。

于 2013-03-26T13:23:00.160 に答える