195

Python リストを簡単に半分に分割する方法を探しています。

したがって、配列がある場合:

A = [0,1,2,3,4,5]

私は得ることができるでしょう:

B = [0,1,2]

C = [3,4,5]
4

19 に答える 19

293
A = [1,2,3,4,5,6]
B = A[:len(A)//2]
C = A[len(A)//2:]

関数が必要な場合:

def split_list(a_list):
    half = len(a_list)//2
    return a_list[:half], a_list[half:]

A = [1,2,3,4,5,6]
B, C = split_list(A)
于 2009-04-15T15:49:42.240 に答える
96

もう少し一般的な解決策(「半分」に分割するだけでなく、必要な部分の数を指定できます):

def split_list(alist, wanted_parts=1):
    length = len(alist)
    return [ alist[i*length // wanted_parts: (i+1)*length // wanted_parts] 
             for i in range(wanted_parts) ]

A = [0,1,2,3,4,5,6,7,8,9]

print split_list(A, wanted_parts=1)
print split_list(A, wanted_parts=2)
print split_list(A, wanted_parts=8)
于 2009-04-15T16:30:41.957 に答える
47
f = lambda A, n=3: [A[i:i+n] for i in range(0, len(A), n)]
f(A)

n- 結果配列の事前定義された長さ

于 2010-02-07T02:30:56.317 に答える
40
def split(arr, size):
     arrs = []
     while len(arr) > size:
         pice = arr[:size]
         arrs.append(pice)
         arr   = arr[size:]
     arrs.append(arr)
     return arrs

テスト:

x=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
print(split(x, 5))

結果:

[[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13]]
于 2014-04-18T06:54:33.170 に答える
20

注文を気にしない場合...

def split(list):  
    return list[::2], list[1::2]

list[::2]0番目の要素から始まるリストの1つおきの要素を取得します。
list[1::2]最初の要素から始まるリストの2つおきの要素を取得します。

于 2011-06-13T09:11:54.880 に答える
13

リストのスライスを使用します。構文は基本的にmy_list[start_index:end_index]

>>> i = [0,1,2,3,4,5]
>>> i[:3] # same as i[0:3] - grabs from first to third index (0->2)
[0, 1, 2]
>>> i[3:] # same as i[3:len(i)] - grabs from fourth index to end
[3, 4, 5]

リストの前半を取得するには、最初のインデックスからlen(i)//2(//は整数除算 - 3//2 will give the floored result of1 , instead of the invalid list index of1.5`)にスライスします。

>>> i[:len(i)//2]
[0, 1, 2]

..そして、値を交換して後半を取得します。

>>> i[len(i)//2:]
[3, 4, 5]
于 2009-04-15T16:28:30.667 に答える
11

B,C=A[:len(A)/2],A[len(A)/2:]

于 2009-04-15T15:50:08.947 に答える
11

これが一般的な解決策です。 arr を count 部分に分割します

def split(arr, count):
     return [arr[i::count] for i in range(count)]
于 2012-07-20T07:17:29.403 に答える
9
def splitter(A):
    B = A[0:len(A)//2]
    C = A[len(A)//2:]

 return (B,C)

テストしたところ、python 3 で int 除算を強制するには二重スラッシュが必要です。元の投稿は正しかったのですが、何らかの理由で Opera で wysiwyg が壊れていました。

于 2009-04-15T15:49:40.807 に答える
7

リストが大きい場合は、itertoolsを使用して、必要に応じて各部分を生成する関数を作成することをお勧めします。

from itertools import islice

def make_chunks(data, SIZE):
    it = iter(data)
    # use `xragne` if you are in python 2.7:
    for i in range(0, len(data), SIZE):
        yield [k for k in islice(it, SIZE)]

これは次のように使用できます。

A = [0, 1, 2, 3, 4, 5, 6]

size = len(A) // 2

for sample in make_chunks(A, size):
    print(sample)

出力は次のとおりです。

[0, 1, 2]
[3, 4, 5]
[6]

@thefourtheye@Bede Constantinidesに感謝

于 2018-12-30T09:10:44.623 に答える
6

配列を size のより小さい配列に分割する、より一般化されたケースについては、公式の Python レシピがありますn

from itertools import izip_longest
def grouper(n, iterable, fillvalue=None):
    "Collect data into fixed-length chunks or blocks"
    # grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx
    args = [iter(iterable)] * n
    return izip_longest(fillvalue=fillvalue, *args)

このコード スニペットは、python itertools doc pageからのものです。

于 2011-04-21T21:44:10.557 に答える
6

これは他のソリューションと似ていますが、少し高速です。

# Usage: split_half([1,2,3,4,5]) Result: ([1, 2], [3, 4, 5])

def split_half(a):
    half = len(a) >> 1
    return a[:half], a[half:]
于 2014-05-27T17:17:30.603 に答える
3

10年後..私は考えました-別のものを追加してみませんか:

arr = 'Some random string' * 10; n = 4
print([arr[e:e+n] for e in range(0,len(arr),n)])
于 2019-02-26T19:22:29.990 に答える
2

上記の答えは多かれ少なかれ正しいですが、配列のサイズが 2 で割り切れない場合、問題が発生する可能性がありa / 2ます。from __future__ import divisionスクリプトの先頭で指定します。いずれにせよa // 2、コードの「前方」互換性を得るためには、整数除算を行う方がよいでしょう。

于 2009-04-15T19:03:34.037 に答える
0

@ChristopheD からヒントを得て

def line_split(N, K=1):
    length = len(N)
    return [N[i*length/K:(i+1)*length/K] for i in range(K)]

A = [0,1,2,3,4,5,6,7,8,9]
print line_split(A,1)
print line_split(A,2)
于 2012-08-02T04:24:25.720 に答える