Podział listy na N części o mniej więcej równej długości


149

Jak najlepiej podzielić listę na mniej więcej równe części? Na przykład, jeśli lista ma 7 elementów i jest podzielona na 2 części, chcemy uzyskać 3 elementy w jednej części, a druga powinna mieć 4 elementy.

Szukam czegoś takiego, even_split(L, n)co rozpada się Lna nczęści.

def chunks(L, n):
    """ Yield successive n-sized chunks from L.
    """
    for i in range(0, len(L), n):
        yield L[i:i+n]

Powyższy kod daje porcje po 3 zamiast 3 porcji. Mógłbym po prostu transponować (powtórzyć to i pobrać pierwszy element z każdej kolumny, wywołać tę część pierwszą, a następnie wziąć drugą i umieścić ją w części drugiej itd.), Ale to niszczy kolejność elementów.

Odpowiedzi:


65

Ten kod jest uszkodzony z powodu błędów zaokrągleń. Nie używaj tego!!!

assert len(chunkIt([1,2,3], 10)) == 10  # fails

Oto jeden, który może działać:

def chunkIt(seq, num):
    avg = len(seq) / float(num)
    out = []
    last = 0.0

    while last < len(seq):
        out.append(seq[int(last):int(last + avg)])
        last += avg

    return out

Testowanie:

>>> chunkIt(range(10), 3)
[[0, 1, 2], [3, 4, 5], [6, 7, 8, 9]]
>>> chunkIt(range(11), 3)
[[0, 1, 2], [3, 4, 5, 6], [7, 8, 9, 10]]
>>> chunkIt(range(12), 3)
[[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]]

9
Twój przykład nie zadziała dla >>> chunkIt(range(8), 6)=>[[0], [1], [2, 3], [4], [5], [6], [7]]
nopper

1
@nopper, dodałem warunek „if num == 1:”, aby obsłużyć ten skrajny przypadek.
paulie4

24
Nowi goście: nie używaj ani nie głosuj za tym kodem , jest uszkodzony. np. chunkIt(range(10), 9)powinien zwrócić 9 części, ale tak nie jest.
wim

3
Ten wątek komentarzy jest naprawdę zagmatwany, ponieważ odpowiedź była edytowana kilka razy. Czy to dobra odpowiedź? Nie jest to dobra odpowiedź?
conchoecia,

6
@conchoecia Niezbyt dobra odpowiedź, przewijaj dalej w dół. Do tej pory było to tylko raz edytowane i była to tylko trywialna edycja (wcięcie z 2 spacji zmienione na 4). Niestety OP „user248237dfsf” nie był widziany na stronie od ponad 3 lat, więc jest niewielka nadzieja na zmianę zaakceptowanej odpowiedzi.
wim

182

Możesz napisać to po prostu jako generator list:

def split(a, n):
    k, m = divmod(len(a), n)
    return (a[i * k + min(i, m):(i + 1) * k + min(i + 1, m)] for i in range(n))

Przykład:

>>> list(split(range(11), 3))
[[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10]]

Włożyć n = min(n, len(a)) # don't create empty bucketsna linii 1, aby uniknąć tworzenia pustych wiader w scenariuszach jak list(split(range(X, Y)))gdzieX < Y
abanana

Widząc, że nie mogę edytować swojego komentarza - powinienem dodać, że moja poprzednia poprawka mogłaby podnieść błąd dzielenia przez zero, jeśli lista jest pusta, więc trzeba ją albo kontrolować zewnętrznie, albo dodać do rozwiązania.
abanana

4
Z odpowiedzi N na SO, to jedyna, która przeszła wszystkie moje testy. gj!
avishayp

2
stackoverflow.com/a/37414115/210971 używa tej samej metody, ale działa również w przypadku pustej listy i licznika podziału 0.
LookAheadAtYourTypes

Piękny! Ponadto n może działać jako rozmiar_batchu, zamieniając k i n w instrukcji return :)
haraprasadj

161

To jest raison d'être dla numpy.array_split*:

>>> import numpy as np
>>> print(*np.array_split(range(10), 3))
[0 1 2 3] [4 5 6] [7 8 9]
>>> print(*np.array_split(range(10), 4))
[0 1 2] [3 4 5] [6 7] [8 9]
>>> print(*np.array_split(range(10), 5))
[0 1] [2 3] [4 5] [6 7] [8 9]

* kredyt dla Zero Piraeus w pokoju 6


1
Co jest *w printza?
yuqli

2
Hej @yuqli, Konwertuje listę czegoś na pojedyncze argumenty do funkcji. spróbuj print(L)i `print (* L). Zobacz także stackoverflow.com/a/36908/2184122 lub wyszukaj „użycie gwiazdki w pythonie”.
Robert Lugg

121

O ile nie chcesz niczego głupiego, takiego jak ciągłe fragmenty:

>>> def chunkify(lst,n):
...     return [lst[i::n] for i in xrange(n)]
... 
>>> chunkify(range(13), 3)
[[0, 3, 6, 9, 12], [1, 4, 7, 10], [2, 5, 8, 11]]

14
Nie powiedziałbym, że ciągłe fragmenty są głupie. Być może chciałbyś, aby porcje były posortowane (np. Chunk [0] <chunk [1]).
tixxit

1
Żartowałem. Ale jeśli naprawdę cię to nie obchodziło, ten sposób ze zrozumieniem listy jest przyjemny i zwięzły.
praca

3
To jest indeksowanie z krokiem n
smci

8
wysłanie tego wyjścia do „zip” daje uporządkowaną listę: zip(*chunkify(range(13), 3))wyniki w[(0, 1, 2), (3, 4, 5), (6, 7, 8), (9, 10, 11)]
gens

2
To rozwiązanie działa dobrze, dopóki nie potrzebujesz, aby kolejność listy pozostała taka sama.
s7anley

18

Zmiana kodu w celu uzyskania nporcji zamiast fragmentów n:

def chunks(l, n):
    """ Yield n successive chunks from l.
    """
    newn = int(len(l) / n)
    for i in xrange(0, n-1):
        yield l[i*newn:i*newn+newn]
    yield l[n*newn-newn:]

l = range(56)
three_chunks = chunks (l, 3)
print three_chunks.next()
print three_chunks.next()
print three_chunks.next()

co daje:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17]
[18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35]
[36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55]

Spowoduje to przypisanie dodatkowych elementów do ostatniej grupy, która nie jest idealna, ale dobrze mieści się w twojej specyfikacji "z grubsza N równych części" :-) Przez to rozumiem, że 56 elementów byłoby lepsze jako (19,19,18), podczas gdy to daje (18, 18, 20).

Możesz uzyskać bardziej zbalansowane dane wyjściowe za pomocą następującego kodu:

#!/usr/bin/python
def chunks(l, n):
    """ Yield n successive chunks from l.
    """
    newn = int(1.0 * len(l) / n + 0.5)
    for i in xrange(0, n-1):
        yield l[i*newn:i*newn+newn]
    yield l[n*newn-newn:]

l = range(56)
three_chunks = chunks (l, 3)
print three_chunks.next()
print three_chunks.next()
print three_chunks.next()

które wyjścia:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18]
[19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37]
[38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55]

daje mi to dziwny wynik. for p in chunks (range (54), 3): print len ​​(p) zwraca 18, 18, 51 ...

Naprawiono, że to była ostateczna wydajność.
paxdiablo

zobacz także rozwiązanie pod linkiem
Jakob Kroeker

To najbardziej przydatna odpowiedź ze względów praktycznych. Dzięki!
mVChr

Kiedy używam tego, robię for x in chunks(mylist,num): print x, otrzymuję pożądane fragmenty, ale między nimi pojawia się pusta lista. Masz jakiś pomysł, dlaczego? To znaczy, dostaję dużo [], jeden po każdym kawałku.
synaptik

12

Jeśli podzielisz nelementy na z grubsza kkawałki, możesz zwiększyć je o n % kjeden element od innych, aby rozdzielić dodatkowe elementy.

Poniższy kod poda długość fragmentów:

[(n // k) + (1 if i < (n % k) else 0) for i in range(k)]

Przykład: n=11, k=3wyniki[4, 4, 3]

Następnie możesz łatwo obliczyć indeks początkowy dla porcji:

[i * (n // k) + min(i, n % k) for i in range(k)]

Przykład: n=11, k=3wyniki[0, 4, 8]

Używając i+1th kawałka jako granicy, otrzymujemy, że ith fragment listy lz len njest

l[i * (n // k) + min(i, n % k):(i+1) * (n // k) + min(i+1, n % k)]

Na koniec utwórz listę ze wszystkich fragmentów, używając funkcji rozumienia list:

[l[i * (n // k) + min(i, n % k):(i+1) * (n // k) + min(i+1, n % k)] for i in range(k)]

Przykład: n=11, k=3, l=range(n)wyniki[range(0, 4), range(4, 8), range(8, 11)]


6

Spowoduje to podział według jednego wyrażenia:

>>> myList = range(18)
>>> parts = 5
>>> [myList[(i*len(myList))//parts:((i+1)*len(myList))//parts] for i in range(parts)]
[[0, 1, 2], [3, 4, 5, 6], [7, 8, 9], [10, 11, 12, 13], [14, 15, 16, 17]]

Lista w tym przykładzie ma rozmiar 18 i jest podzielona na 5 części. Rozmiar części różni się nie więcej niż jednym elementem.



4

Oto jeden, który dodaje, Noneaby listy były równej długości

>>> from itertools import izip_longest
>>> def chunks(l, n):
    """ Yield n successive chunks from l. Pads extra spaces with None
    """
    return list(zip(*izip_longest(*[iter(l)]*n)))

>>> l=range(54)

>>> chunks(l,3)
[(0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51), (1, 4, 7, 10, 13, 16, 19, 22, 25, 28, 31, 34, 37, 40, 43, 46, 49, 52), (2, 5, 8, 11, 14, 17, 20, 23, 26, 29, 32, 35, 38, 41, 44, 47, 50, 53)]

>>> chunks(l,4)
[(0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52), (1, 5, 9, 13, 17, 21, 25, 29, 33, 37, 41, 45, 49, 53), (2, 6, 10, 14, 18, 22, 26, 30, 34, 38, 42, 46, 50, None), (3, 7, 11, 15, 19, 23, 27, 31, 35, 39, 43, 47, 51, None)]

>>> chunks(l,5)
[(0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50), (1, 6, 11, 16, 21, 26, 31, 36, 41, 46, 51), (2, 7, 12, 17, 22, 27, 32, 37, 42, 47, 52), (3, 8, 13, 18, 23, 28, 33, 38, 43, 48, 53), (4, 9, 14, 19, 24, 29, 34, 39, 44, 49, None)]

4

Oto moje rozwiązanie:

def chunks(l, amount):
    if amount < 1:
        raise ValueError('amount must be positive integer')
    chunk_len = len(l) // amount
    leap_parts = len(l) % amount
    remainder = amount // 2  # make it symmetrical
    i = 0
    while i < len(l):
        remainder += leap_parts
        end_index = i + chunk_len
        if remainder >= amount:
            remainder -= amount
            end_index += 1
        yield l[i:end_index]
        i = end_index

Produkuje

    >>> list(chunks([1, 2, 3, 4, 5, 6, 7], 3))
    [[1, 2], [3, 4, 5], [6, 7]]

4

Oto generator, który może obsłużyć dowolną dodatnią (całkowitą) liczbę fragmentów. Jeśli liczba porcji jest większa niż długość listy wejściowej, niektóre porcje będą puste. Ten algorytm przełącza się między krótkimi i długimi kawałkami, zamiast je segregować.

Dołączyłem również kod do testowania ragged_chunksfunkcji.

''' Split a list into "ragged" chunks

    The size of each chunk is either the floor or ceiling of len(seq) / chunks

    chunks can be > len(seq), in which case there will be empty chunks

    Written by PM 2Ring 2017.03.30
'''

def ragged_chunks(seq, chunks):
    size = len(seq)
    start = 0
    for i in range(1, chunks + 1):
        stop = i * size // chunks
        yield seq[start:stop]
        start = stop

# test

def test_ragged_chunks(maxsize):
    for size in range(0, maxsize):
        seq = list(range(size))
        for chunks in range(1, size + 1):
            minwidth = size // chunks
            #ceiling division
            maxwidth = -(-size // chunks)
            a = list(ragged_chunks(seq, chunks))
            sizes = [len(u) for u in a]
            deltas = all(minwidth <= u <= maxwidth for u in sizes)
            assert all((sum(a, []) == seq, sum(sizes) == size, deltas))
    return True

if test_ragged_chunks(100):
    print('ok')

Możemy uczynić to nieco bardziej wydajnym, eksportując mnożenie do rangewywołania, ale myślę, że poprzednia wersja jest bardziej czytelna (i bardziej SUCHA).

def ragged_chunks(seq, chunks):
    size = len(seq)
    start = 0
    for i in range(size, size * chunks + 1, size):
        stop = i // chunks
        yield seq[start:stop]
        start = stop

3

Spójrz na numpy.split :

>>> a = numpy.array([1,2,3,4])
>>> numpy.split(a, 2)
[array([1, 2]), array([3, 4])]

5
A numpy.array_split () jest jeszcze bardziej adekwatne, ponieważ z grubsza dzieli.
Yariv

11
To nie działa, jeśli rozmiar tablicy nie jest podzielny przez liczbę podziałów.
Dan,

1
To jest zła odpowiedź, Twoje rozwiązanie zwraca listę ndarrays, a nie listę list
Chłop Z Lasu

3

Implementacja metodą numpy.linspace.

Po prostu określ liczbę części, na które chcesz podzielić tablicę. Podziały będą prawie równej wielkości.

Przykład:

import numpy as np   
a=np.arange(10)
print "Input array:",a 
parts=3
i=np.linspace(np.min(a),np.max(a)+1,parts+1)
i=np.array(i,dtype='uint16') # Indices should be floats
split_arr=[]
for ind in range(i.size-1):
    split_arr.append(a[i[ind]:i[ind+1]]
print "Array split in to %d parts : "%(parts),split_arr

Daje:

Input array: [0 1 2 3 4 5 6 7 8 9]
Array split in to 3 parts :  [array([0, 1, 2]), array([3, 4, 5]), array([6, 7, 8, 9])]

3

Moje rozwiązanie, łatwe do zrozumienia

def split_list(lst, n):
    splitted = []
    for i in reversed(range(1, n + 1)):
        split_point = len(lst)//i
        splitted.append(lst[:split_point])
        lst = lst[split_point:]
    return splitted

I najkrótsza jedna linijka na tej stronie (napisana przez moją dziewczynę)

def split(l, n):
    return [l[int(i*len(l)/n):int((i+1)*len(l)/n-1)] for i in range(n)]

FYI: Twoja jednolinijka jest zepsuta, daje błędne wyniki. Drugi działa pięknie.
Paulo Freitas

2

Korzystanie ze rozumienia list:

def divide_list_to_chunks(list_, n):
    return [list_[start::n] for start in range(n)]

Nie rozwiązuje to problemu wyrównania wszystkich fragmentów.
SuperBiasedMan

0

Innym sposobem byłoby coś takiego, chodzi o to, aby użyć groupera, ale się go pozbyć None. W tym przypadku będziemy mieć wszystkie „małe_części” utworzone z elementów w pierwszej części listy i „większe_części” z dalszej części listy. Długość „większych części” wynosi len (small_parts) + 1. Musimy rozważyć x jako dwie różne części składowe.

from itertools import izip_longest

import numpy as np

def grouper(n, iterable, fillvalue=None): # This is grouper from itertools
    "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
    args = [iter(iterable)] * n
    return izip_longest(fillvalue=fillvalue, *args)

def another_chunk(x,num):
    extra_ele = len(x)%num #gives number of parts that will have an extra element 
    small_part = int(np.floor(len(x)/num)) #gives number of elements in a small part

    new_x = list(grouper(small_part,x[:small_part*(num-extra_ele)]))
    new_x.extend(list(grouper(small_part+1,x[small_part*(num-extra_ele):])))

    return new_x

Sposób, w jaki to skonfigurowałem, zwraca listę krotek:

>>> x = range(14)
>>> another_chunk(x,3)
[(0, 1, 2, 3), (4, 5, 6, 7, 8), (9, 10, 11, 12, 13)]
>>> another_chunk(x,4)
[(0, 1, 2), (3, 4, 5), (6, 7, 8, 9), (10, 11, 12, 13)]
>>> another_chunk(x,5)
[(0, 1), (2, 3, 4), (5, 6, 7), (8, 9, 10), (11, 12, 13)]
>>> 

0

Oto inny wariant, który rozkłada „pozostałe” elementy równomiernie na wszystkie fragmenty, jeden po drugim, aż ich nie ma. W tej implementacji większe fragmenty pojawiają się na początku procesu.

def chunks(l, k):
  """ Yield k successive chunks from l."""
  if k < 1:
    yield []
    raise StopIteration
  n = len(l)
  avg = n/k
  remainders = n % k
  start, end = 0, avg
  while start < n:
    if remainders > 0:
      end = end + 1
      remainders = remainders - 1
    yield l[start:end]
    start, end = end, end+avg

Na przykład wygeneruj 4 fragmenty z listy 14 elementów:

>>> list(chunks(range(14), 4))
[[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10], [11, 12, 13]]
>>> map(len, list(chunks(range(14), 4)))
[4, 4, 3, 3]

0

To samo, co odpowiedź zadania , ale uwzględnia listy o rozmiarze mniejszym niż liczba fragmentów.

def chunkify(lst,n):
    [ lst[i::n] for i in xrange(n if n < len(lst) else len(lst)) ]

jeśli n (liczba fragmentów) wynosi 7, a lst (lista do podziału) to [1, 2, 3], fragmenty to [[0], [1], [2]] zamiast [[0], [1] ], [2], [], [], [], []]


0

Możesz również użyć:

split=lambda x,n: x if not x else [x[:n]]+[split([] if not -(len(x)-n) else x[-(len(x)-n):],n)][0]

split([1,2,3,4,5,6,7,8,9],2)

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

0
def evenly(l, n):
    len_ = len(l)
    split_size = len_ // n
    split_size = n if not split_size else split_size
    offsets = [i for i in range(0, len_, split_size)]
    return [l[offset:offset + split_size] for offset in offsets]

Przykład:

l = [a for a in range(97)] powinien składać się z 10 części, z których każda ma 9 elementów oprócz ostatniej.

Wynik:

[[0, 1, 2, 3, 4, 5, 6, 7, 8],
 [9, 10, 11, 12, 13, 14, 15, 16, 17],
 [18, 19, 20, 21, 22, 23, 24, 25, 26],
 [27, 28, 29, 30, 31, 32, 33, 34, 35],
 [36, 37, 38, 39, 40, 41, 42, 43, 44],
 [45, 46, 47, 48, 49, 50, 51, 52, 53],
 [54, 55, 56, 57, 58, 59, 60, 61, 62],
 [63, 64, 65, 66, 67, 68, 69, 70, 71],
 [72, 73, 74, 75, 76, 77, 78, 79, 80],
 [81, 82, 83, 84, 85, 86, 87, 88, 89],
 [90, 91, 92, 93, 94, 95, 96]]

0

Powiedzmy, że chcesz podzielić listę [1, 2, 3, 4, 5, 6, 7, 8] na 3 listy elementów

np. [[1,2,3], [4, 5, 6], [7, 8]] , gdzie jeśli ostatnie pozostałe elementy są mniejsze niż 3, są zgrupowane razem.

my_list = [1, 2, 3, 4, 5, 6, 7, 8]
my_list2 = [my_list[i:i+3] for i in range(0, len(my_list), 3)]
print(my_list2)

Produkcja: [[1, 2, 3], [4, 5, 6], [7, 8]]

Gdzie długość jednej części wynosi 3. Zastąp 3 własnym rozmiarem porcji.


0

1>

import numpy as np

data # your array

total_length = len(data)
separate = 10
sub_array_size = total_length // separate
safe_separate = sub_array_size * separate

splited_lists = np.split(np.array(data[:safe_separate]), separate)
splited_lists[separate - 1] = np.concatenate(splited_lists[separate - 1], 
np.array(data[safe_separate:total_length]))

splited_lists # your output

2>

splited_lists = np.array_split(np.array(data), separate)

0
def chunk_array(array : List, n: int) -> List[List]:
    chunk_size = len(array) // n 
    chunks = []
    i = 0
    while i < len(array):
        # if less than chunk_size left add the remainder to last element
        if len(array) - (i + chunk_size + 1) < 0:
            chunks[-1].append(*array[i:i + chunk_size])
            break
        else:
            chunks.append(array[i:i + chunk_size])
            i += chunk_size
    return chunks

oto moja wersja (zainspirowana Maxem)


-1

Zaokrąglenie przestrzeni linkowej i użycie jej jako indeksu jest łatwiejszym rozwiązaniem niż to, co proponuje amit12690.

function chunks=chunkit(array,num)

index = round(linspace(0,size(array,2),num+1));

chunks = cell(1,num);

for x = 1:num
chunks{x} = array(:,index(x)+1:index(x+1));
end
end

-1
#!/usr/bin/python


first_names = ['Steve', 'Jane', 'Sara', 'Mary','Jack','Bob', 'Bily', 'Boni', 'Chris','Sori', 'Will', 'Won','Li']

def chunks(l, n):
for i in range(0, len(l), n):
    # Create an index range for l of n items:
    yield l[i:i+n]

result = list(chunks(first_names, 5))
print result

Wybrałem z tego linku i to mi pomogło. Miałem predefiniowaną listę.


-1

powiedz, że chcesz podzielić na 5 części:

p1, p2, p3, p4, p5 = np.split(df, 5)

4
Nie daje to odpowiedzi na pytanie, np. Jak byś to napisał, jeśli nie wiesz z góry, że chcesz go podzielić na pięć części. Poza tym zakładasz (domyślam się) numpy i być może ramkę danych pandy. OP pyta o listę ogólną.
NickD

-1

Sam napisałem kod w tym przypadku:

def chunk_ports(port_start, port_end, portions):
    if port_end < port_start:
        return None

    total = port_end - port_start + 1

    fractions = int(math.floor(float(total) / portions))

    results = []

    # No enough to chuck.
    if fractions < 1:
        return None

    # Reverse, so any additional items would be in the first range.
    _e = port_end
    for i in range(portions, 0, -1):
        print "i", i

        if i == 1:
            _s = port_start
        else:
            _s = _e - fractions + 1

        results.append((_s, _e))

        _e = _s - 1

    results.reverse()

    return results

divide_ports (1, 10, 9) zwróci

[(1, 2), (3, 3), (4, 4), (5, 5), (6, 6), (7, 7), (8, 8), (9, 9), (10, 10)]

-1

ten kod działa dla mnie (zgodny z Python3):

def chunkify(tab, num):
    return [tab[i*num: i*num+num] for i in range(len(tab)//num+(1 if len(tab)%num else 0))]

przykład (dla typu bytearray , ale działa również dla list s):

b = bytearray(b'\x01\x02\x03\x04\x05\x06\x07\x08')
>>> chunkify(b,3)
[bytearray(b'\x01\x02\x03'), bytearray(b'\x04\x05\x06'), bytearray(b'\x07\x08')]
>>> chunkify(b,4)
[bytearray(b'\x01\x02\x03\x04'), bytearray(b'\x05\x06\x07\x08')]

-1

Ten zapewnia fragmenty o długości <= n,> = 0

pok

 chunkify(lst, n):
    num_chunks = int(math.ceil(len(lst) / float(n))) if n < len(lst) else 1
    return [lst[n*i:n*(i+1)] for i in range(num_chunks)]

na przykład

>>> chunkify(range(11), 3)
[[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10]]
>>> chunkify(range(11), 8)
[[0, 1, 2, 3, 4, 5, 6, 7], [8, 9, 10]]

-1

Wypróbowałem większość rozwiązań, ale nie działały one w moim przypadku, więc tworzę nową funkcję, która działa w większości przypadków i dla dowolnego typu tablicy:

import math

def chunkIt(seq, num):
    seqLen = len(seq)
    total_chunks = math.ceil(seqLen / num)
    items_per_chunk = num
    out = []
    last = 0

    while last < seqLen:
        out.append(seq[last:(last + items_per_chunk)])
        last += items_per_chunk

    return out
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.