4

オブジェクトのリストがあり、次のように、別のリストのオブジェクトを使用して分割されたオブジェクトのリストのリストを取得したいと考えています。

l = ['x',1,2,3,'a',5,6,1,7]

および別のオブジェクトのリスト

s = ['a', 1, 4]

そして、私は結果を得たいと思っています:

[ ['x'], [1, 2, 3], ['a', 5, 6], [1, 7] ]

それを行うための素敵な/ Pythonicな方法はありますか?

編集:

結果の各リストの先頭が の要素にsなり、これらすべてのリストが最初のリストの要素を同じ順序で保持するようにします。

4

2 に答える 2

5

ジェネレーターはすぐにそれを行います:

def split_on_members(seq, s):
    s = set(s)
    chunk = []
    for i in seq:
        if i in s and chunk:
            yield chunk
            chunk = []
        chunk.append(i)
    if chunk:
        yield chunk

与える:

>>> list(split_on_members(l, s))
[['x'], [1, 2, 3], ['a', 5, 6], [1, 7]]

もちろん、完全なリストを作成せずにジェネレーターをループすることもできます。

>>> for group in split_on_members(l, s):
...     print group
... 
['x']
[1, 2, 3]
['a', 5, 6]
[1, 7]
于 2013-03-09T15:02:35.973 に答える
2

この2つの機能を試して、

  1. 「戻る」タイプ

    def overlap_split_list(l,s):
        l1 = []
        l2 = []
        for i in l:
            if i in s:
                l1.append(l2)
                l2 = []
            l2.append(i)
        if l2: l1.append(l2)
        return l1
    
  2. ジェネレーターの種類

    def generator_overlap_split_list(l,s):
        l2 = []
        for i in l:
            if i in s:
                yield l2
                l2 = []
            l2.append(i)
        if l2: yield l2
    

出力用(すべて同じになります)

print overlap_split_list(l,s)    
print [i for i in generator_overlap_split_list(l,s)]
print list(generator_overlap_split_list(l,s))
于 2013-03-09T15:00:41.670 に答える