0

セットまたはリストが与えられた場合 (順序付けられていると仮定)

myset = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]

範囲内にいくつの数字が現れるかを知りたいです。私の範囲が 10 だとします。次に、上記のリストを考えると、10 のセットが 2 つあります。

関数を返したい[10,10]

私の範囲が15だった場合。[15,5]

範囲が変わります。これが私が思いついたものです

myRange = 10
start = 1
current = start
next = current + myRange
count = 0
setTotal = []
for i in myset:
    if i >= current and i < next :
        count = count + 1
        print str(i)+" in "+str(len(setTotal)+1)
    else:
        current = current + myRange
        next = myRange + current
        if next >= myset[-1]:
            next = myset[-1]
        setTotal.append(count)
        count = 0

print setTotal

出力

1 in 1
2 in 1
3 in 1
4 in 1
5 in 1
6 in 1
7 in 1
8 in 1
9 in 1
10 in 1
12 in 2
13 in 2
14 in 2
15 in 2
16 in 2
17 in 2
18 in 2
19 in 2
[10, 8]

スキップされた 11 と 20 に注意してください。私もこの状態をいじって、有線の結果を得ました。

編集: 範囲は、範囲内のすべての値が 1 つのチャックにカウントされる範囲を定義します。

現在の値から現在の値+範囲までの範囲を1つのチャンクと考えてください。

編集:

必要な出力:

1 in 1
2 in 1
3 in 1
4 in 1
5 in 1
6 in 1
7 in 1
8 in 1
9 in 1
10 in 1
11 in 2
12 in 2
13 in 2
14 in 2
15 in 2
16 in 2
17 in 2
18 in 2
19 in 2
[10, 10]
4

3 に答える 3

2

適切なキー関数をgroupby使用すると、モジュールのメソッドitertoolsにより、これが非常に簡単になります。

from itertools import groupby

def ranger(values, range_size):
    def keyfunc(n):
        key = n/(range_size+1) + 1
        print '{} in {}'.format(n, key)
        return key

    return [len(list(g)) for k, g in groupby(values, key=keyfunc)]

myset = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]
print ranger(myset, 10)
print ranger(myset, 15)
于 2013-06-08T02:31:27.480 に答える
1

単純な除算と剰余を使用したい。divmod()関数は両方を提供します:

def chunks(lst, size):
    count, remainder = divmod(len(lst), size)
    return [size] * count + ([remainder] if remainder else [])

目的の出力を作成するには、次の出力を使用しますchunks()

lst = range(1, 21)
size = 10

start = 0
for count, chunk in enumerate(chunks(lst, size), 1):
    for i in lst[start:start + chunk]:
        print '{} in {}'.format(i, count)
    start += chunk

count現在のチャンクの番号です (1 から始まります。Python は通常 0 ベースのインデックスを使用します)。

これは以下を出力します:

1 in 1
2 in 1
3 in 1
4 in 1
5 in 1
6 in 1
7 in 1
8 in 1
9 in 1
10 in 1
11 in 2
12 in 2
13 in 2
14 in 2
15 in 2
16 in 2
17 in 2
18 in 2
19 in 2
20 in 2
于 2013-06-08T01:37:17.060 に答える
-1

特定のチャンクに含まれる数値を気にしない場合は、サイズを簡単に計算できます。

def chunk_sizes(lst, size):
    complete = len(lst) // size  # Number of `size`-sized chunks
    partial = len(lst) % size    # Last chunk

    if partial:  # Sometimes the last chunk is empty
        return [size] * complete + [partial]
    else:
        return [size] * complete
于 2013-06-08T01:35:41.123 に答える