0

渡されたリストからそれぞれ5つの要素を含む動的サブリストのセットを作成する関数を作成しようとしています。これがコードでの私の試みです。

def sublists(seq):
    i=0
    x=[]
    while i<len(seq)-1:
        j=0
        while j<5:
            X.append(seq[i]) # How do I change X after it reaches size 5?
     #return set of sublists

編集:

サンプル入力:[1,2,3,4,5,6,7,8,9,10]

期待される出力:[[1,2,3,4,5],[6,7,8,9,10]]

4

3 に答える 3

3

まず、最初に、一時的なリストと永続的なリストの2つのリストを返す必要があります(または少なくともそうする必要があります)(また、jとiを増やすか、より実際にはforループを使用する必要があります。しかし、私はあなたがそれを投稿するのを忘れたと思います)。

指定されたスタイルが期待される結果と簡単に一致しないため、EDITは最初のコードを削除しました。他の2つの可能性を参照してください。

または、より賢明に:

def sublists(seq):
    x=[]
    for i in range(0,len(seq),5):
        x.append(seq[i:i+5])
    return x

または、もっと賢明なことに、単純なリスト内包表記:

def sublists(seq):
    return [seq[i:i+5] for i in range(0,len(seq),5)]

リストが与えられたとき:

l = [1,2,3,4,5,6,7,8,9,10]

彼らは戻ってきます

[[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]]
于 2012-05-16T05:14:49.910 に答える
0

「動的サブリスト」とは、リストを5つの要素のグループに分割することを意味しますか?これはあなたのアプローチに似ています:

def sublists(lst, n):
    ret = []
    i = 0
    while i < len(lst):
        ret.append(seq[i:i+n])
        i += n
    return ret

または、イテレータを使用します。

def sublists(seq, n):
    it = iter(seq)
    while True:
        r = list(itertools.islice(it, 5))
        if not r:
            break
        yield r

これは、最大5つの長さのリストに対するリストのイテレータを返します。(list電話に出た場合、同じ順序でイテレータにアクセスしないと、奇妙なことが起こります。)

于 2012-05-16T05:08:13.257 に答える
0

使用を検討しましたitertools.combinations(...)か?

例えば:

>>> from itertools import combinations
>>> l = [1,2,3,4,5,6]
>>> list(combinations(l, 5))
[(1, 2, 3, 4, 5), (1, 2, 3, 4, 6), (1, 2, 3, 5, 6), (1, 2, 4, 5, 6), (1, 3, 4, 5, 6), (2, 3, 4, 5, 6)]
于 2012-05-16T05:08:31.087 に答える