0

リストliから長さrのすべての(おそらく連続していない)サブリストを抽出するために、関数を書きました

def sublist(li, r):
    output = list()
    if r == 1:
        return [ [element] for element in li ]
    for firstelement in [1,len(li)-r+1]:
        output +=  [ [li[firstelement-1]] + smallerlist for smallerlist in   sublist(li[firstelement:],r-1) ]
    return output

うまくいかないようです:

sage: li = [20, 17, 33, 3001]
sage: sublist(li, 2)
[[20, 17], [20, 33], [20, 3001], [33, 3001]]

17 で始まるサブリストが飛び越えていることに注意してください。問題は、再帰呼び出し中にカウンターのfirstelementが変更されることです。これを修正する簡単な方法はありますか?

4

1 に答える 1

2

うーん、推測では -組み合わせを複製しようとしていますか?:

from itertools import combinations
list(combinations(el, 2))
# [(20, 17), (20, 33), (20, 3001), (17, 33), (17, 3001), (33, 3001)]

また、"equivalent to:" セクションを使用して、独自のコードを作成できます。

def combinations(iterable, r):
    # combinations('ABCD', 2) --> AB AC AD BC BD CD
    # combinations(range(4), 3) --> 012 013 023 123
    pool = tuple(iterable)
    n = len(pool)
    if r > n:
        return
    indices = range(r)
    yield tuple(pool[i] for i in indices)
    while True:
        for i in reversed(range(r)):
            if indices[i] != i + n - r:
                break
        else:
            return
        indices[i] += 1
        for j in range(i+1, r):
            indices[j] = indices[j-1] + 1
        yield tuple(pool[i] for i in indices)
于 2012-10-18T11:07:17.320 に答える