1

私が探しているものを表現するより良い方法を知りませんので、ご容赦ください。

17 個の要素のリストがあるとします。簡潔にするために、このリストを として表しますABCDEFGHIJKLMNOPQ。これを 7 つの十分に「均等な」サブリストに分割したい場合は、次のようになります。

ABC DE FGH IJ KL MNO PQ

ここで、各サブリストの長さは3, 2, 3, 2, 2, 3, 2です。最大長は最小長よりも 1 だけ長くなりABC DE FGH I JKL MN OPQます。7 つのサブリストもありますが、ここでは長さの範囲は 2 です。

さらに、3 の各ペアを区切る 2 の数を調べます。これは、RANGE ≤ 1 の同じ規則に従います。長さの範囲もABC DEF GH IJ KLM NO PQ1 ですが、不均衡です: 3、3、2、2、3、2、2 . 理想的には、このような方法でサブリストを縮小し続ける場合、数値が相互に 1 を超えて逸脱することはありません。

もちろん、この方法でリストをサブリストに「均等に」分割する方法は複数あります。私は網羅的な解決策を探しているわけではありません。任意の長さと任意の数のサブリストのリストに対して Python で 1 つの解決策を取得できれば、それで十分です。問題は、そのような問題を解決するときにどこから始めればよいかさえわからないことです。私が探しているものを知っている人はいますか?

4

3 に答える 3

3
>>> s='ABCDEFGHIJKLMNOPQ'
>>> parts=7
>>> [s[i*len(s)//parts:(i+1)*len(s)//parts] for i in range(parts)]
['AB', 'CD', 'EFG', 'HI', 'JKL', 'MN', 'OPQ']


>>> import string
>>> for j in range(26):
...  print [string.uppercase[i*j//parts:(i+1)*j//parts] for i in range(parts)]
... 
['', '', '', '', '', '', '']
['', '', '', '', '', '', 'A']
['', '', '', 'A', '', '', 'B']
['', '', 'A', '', 'B', '', 'C']
['', 'A', '', 'B', '', 'C', 'D']
['', 'A', 'B', '', 'C', 'D', 'E']
['', 'A', 'B', 'C', 'D', 'E', 'F']
['A', 'B', 'C', 'D', 'E', 'F', 'G']
['A', 'B', 'C', 'D', 'E', 'F', 'GH']
['A', 'B', 'C', 'DE', 'F', 'G', 'HI']
['A', 'B', 'CD', 'E', 'FG', 'H', 'IJ']
['A', 'BC', 'D', 'EF', 'G', 'HI', 'JK']
['A', 'BC', 'DE', 'F', 'GH', 'IJ', 'KL']
['A', 'BC', 'DE', 'FG', 'HI', 'JK', 'LM']
['AB', 'CD', 'EF', 'GH', 'IJ', 'KL', 'MN']
['AB', 'CD', 'EF', 'GH', 'IJ', 'KL', 'MNO']
['AB', 'CD', 'EF', 'GHI', 'JK', 'LM', 'NOP']
['AB', 'CD', 'EFG', 'HI', 'JKL', 'MN', 'OPQ']
['AB', 'CDE', 'FG', 'HIJ', 'KL', 'MNO', 'PQR']
['AB', 'CDE', 'FGH', 'IJ', 'KLM', 'NOP', 'QRS']
['AB', 'CDE', 'FGH', 'IJK', 'LMN', 'OPQ', 'RST']
['ABC', 'DEF', 'GHI', 'JKL', 'MNO', 'PQR', 'STU']
['ABC', 'DEF', 'GHI', 'JKL', 'MNO', 'PQR', 'STUV']
['ABC', 'DEF', 'GHI', 'JKLM', 'NOP', 'QRS', 'TUVW']
['ABC', 'DEF', 'GHIJ', 'KLM', 'NOPQ', 'RST', 'UVWX']
['ABC', 'DEFG', 'HIJ', 'KLMN', 'OPQ', 'RSTU', 'VWXY']
于 2011-07-28T05:13:57.313 に答える
1

長さNのリストがあり、いくつかのサブリストSが必要な場合は、余りのある除算から始める必要があるように思われます。N==17およびS==7の場合、17 // 7 == 2および17%7 == 3になります。したがって、2の7つの長さの値から始めることができますが、長さの3をインクリメントする必要があることを知ってください。残りを処理するために1ずつの値。長さの値のリストは長さ7であり、インクリメントする値が3つあるため、X = 7/3を計算し、それをストライドとして使用できます。0番目のアイテムをインクリメントしてから、int(X)アイテムのint(2 * X)アイテムなど。

それでもうまくいかない場合は、Skienaによるアルゴリズム設計マニュアルという本を入手して、セットとツリーのアルゴリズムを確認することをお勧めします。

http://www.algorist.com/

于 2011-07-28T04:54:29.363 に答える
0

http://docs.python.org/library/itertools.htmlの「グルーパー」の例を参照してください。

于 2011-07-28T05:07:39.267 に答える