10

私はこれを行っていますが、これははるかに少ないコードで実現できると感じています。やっぱりパイソンです。リストから始めて、文字列プレフィックスに基づいてそのリストをサブセットに分割します。

# Splitting a list into subsets
# expected outcome:
# [['sub_0_a', 'sub_0_b'], ['sub_1_a', 'sub_1_b']]

mylist = ['sub_0_a', 'sub_0_b', 'sub_1_a', 'sub_1_b']

def func(l, newlist=[], index=0):
    newlist.append([i for i in l if i.startswith('sub_%s' % index)])
    # create a new list without the items in newlist
    l = [i for i in l if i not in newlist[index]]

    if len(l):
        index += 1
        func(l, newlist, index)

func(mylist)
4

3 に答える 3

18

使用できますitertools.groupby

>>> import itertools
>>> mylist = ['sub_0_a', 'sub_0_b', 'sub_1_a', 'sub_1_b']
>>> for k,v in itertools.groupby(mylist,key=lambda x:x[:5]):
...     print k, list(v)
... 
sub_0 ['sub_0_a', 'sub_0_b']
sub_1 ['sub_1_a', 'sub_1_b']

または指定したとおりに:

>>> [list(v) for k,v in itertools.groupby(mylist,key=lambda x:x[:5])]
[['sub_0_a', 'sub_0_b'], ['sub_1_a', 'sub_1_b']]

もちろん、一般的な注意事項が適用されます (グループ化に使用しているのと同じキーでリストがソートされていることを確認してください)。実際のデータには、もう少し複雑なキー関数が必要になる場合があります...

于 2012-11-13T21:04:45.623 に答える
2
In [28]: mylist = ['sub_0_a', 'sub_0_b', 'sub_1_a', 'sub_1_b']

In [29]: lis=[]

In [30]: for x in mylist:
    i=x.split("_")[1]
    try:
        lis[int(i)].append(x)
    except:    
        lis.append([])
        lis[-1].append(x)
   ....:         

In [31]: lis
Out[31]: [['sub_0_a', 'sub_0_b'], ['sub_1_a', 'sub_1_b']]
于 2012-11-13T21:06:25.100 に答える
2

itertools'を使用groupby:

def get_field_sub(x): return x.split('_')[1]

mylist = sorted(mylist, key=get_field_sub)
[ (x, list(y)) for x, y in groupby(mylist, get_field_sub)]
于 2012-11-13T21:10:12.013 に答える