2

重複の可能性:
Pythonでリストを均等なサイズのチャンクに分割するにはどうすればよいですか?

私はそのlistようなものを持っています:

L = [1,2,3,4,5,6,7,8]

Lこれを次のような3つの部分に分割したいとします。

result = [[1,2,3],[4,5,6],[7,8]]

より高度なプログラミング方法を使用せずにこれを行うにはどうすればよいですか(単純なPythonメソッドのみを使用)?

4

2 に答える 2

1

次のようなことを試すことができます:

In [13]: l = [1,2,3,4,5,6,7,8]

In [14]: result = [l[i:i+3] for i in xrange(0, len(l), 3)]

In [15]: result
Out[15]: [[1, 2, 3], [4, 5, 6], [7, 8]]

これにより、長さがのスライスがリストから引き出されます。nここで、nは追加するi数値であり、はのステップ値でもありますrange。@Ericが指摘したように、これはリストを3つのチャンクに分割しますが、3つのチャンクには分割しません。それを3つのチャンクに分割するには、次のようにします。

In [21]: l = [1,2,3,4,5,6,7,8]

In [22]: chunk = int(round(len(l)/3.0))

In [23]: result = [l[i:i+chunk] for i in range(0,len(l),chunk)]

In [24]: result
Out[24]: [[1, 2, 3], [4, 5, 6], [7, 8]]

In [25]: l = [1,2,3,4,5]

In [26]: chunk = int(round(len(l)/3.0))

In [27]: result = [l[i:i+chunk] for i in range(0,len(l),chunk)]

In [28]: result
Out[28]: [[1, 2], [3, 4], [5]]

特定の制約があるように思われるので、これもforループで記述することができます(ただし、実際には上記のものよりも多くの関数呼び出しがあります:)):

In [17]: result = []

In [18]: for i in xrange(0, len(l), 3):
   ....:     result.append(l[i:i+3])
   ....:     
   ....:     

In [19]: result
Out[19]: [[1, 2, 3], [4, 5, 6], [7, 8]]
于 2012-12-11T01:05:15.657 に答える
1

RocketDonkeyの答えは問題ないはずです。リスト内包表記のないものは次のとおりです。

l = [1,2,3,4,5,6,7,8]
result = {}
idx = 0
for i in l:
    group = idx/3
    if group not in result:
        result[group] = []
    result[group].append(i)
    idx += 1
result.values()


>>> [[1, 2, 3], [4, 5, 6], [7, 8]]

enumerate()手動のidx増分を削除するために使用できます。

于 2012-12-11T01:17:36.783 に答える