2017-09-29 77 views
5

Próbuję wymyślić funkcję, która pobiera dane wejściowe x i podzielić dużą listę z liczbą elementów x * x na x mniejsze listy z x elementów w każdym lista npPodzielić listę elementów n * n na n list z n elementami na każdej liście

big_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16] 

def split_list (x): 
big_list = pairs (x) 
small_list = [big_list[0:x] for x in range (x)] 

Moja wyjściowa musi być:

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

ale nie otrzymuję go, co polecacie?

+0

dlaczego nie można po prostu użyć przekształcenia? – Abra001

+1

"po prostu użyj numpy" to jquery z Pythona. –

+0

https://stackoverflow.com/questions/30379560/what-does-this-function-do-python-iterators –

Odpowiedz

7

Można spróbować to:

big_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16] 

def split_list (x): 
    return [big_list[i:i+x] for i in range(0, len(big_list), x)] 

print(split_list(4)) 

wyjściowa:

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

Pierwszy chcesz uzyskać rozmiar za pomocą pierwiastka kwadratowego, więc na liście rozmiarów n byś mieć m x m macierz z m = n ** 0.5. Niech najpierw zdefiniować swoją funkcję:

def square(array): 
    n = len(array) 
    m = int(n ** 0.5) 

Ponieważ lista rozmiary muszą być liczbami całkowitymi, musimy zadzwonić int na wynik. Następnie chcemy rozpocząć od 0 i liczyć i aż do n przez m każdym razem, biorąc m elementy począwszy od i:

def square(array): 
    n = len(array) 
    m = int(n ** 0.5) 
    result = [] 
    for i in range(0, n, m): 
     result.append(array[i:i + m]) 
    return result 

I to wszystko.

Alternatywnie s=lambda a:(lambda m:[a[i*m:i*m+m]for i in range(m)])(int(len(a)**.5))

1

dlaczego nie korzystać numpy:

>>> import numpy as np 
>>> big_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16] 
>>> a=np.array(big_list) 
>>> a 
array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]) 
>>> n=int(len(big_list)**0.5) 
>>> a.reshape(n,n) 
array([[ 1, 2, 3, 4], 
     [ 5, 6, 7, 8], 
     [ 9, 10, 11, 12], 
     [13, 14, 15, 16]]) 

lub po prostu:

>>> big_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16] 
>>> n=int(len(big_list)**0.5) 
>>> new_list=[big_list[i:i+n] for i in range(0, len(big_list), n)] 
>>> new_list 
[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]] 
2

używam tego kodu przez cały czas.

def chunkify(items, chunk_len): 
    return [items[i:i+chunk_len] for i in range(0,len(items),chunk_len)] 
2

Oto jedno rozwiązanie:

def split_list(big_list, x): 
    list_size = len(big_list) 
    splits = int(list_size/x) 

    return [big_list[k*x:k*x+x] for k in range(splits)] 

big_list = [i+1 for i in range(16)] 
print(big_list) 
# [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16] 

small_list = split_list(big_list, 4) 
print(small_list) 
# [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]] 


small_list = split_list(big_list, 2) 
print(small_list) 
# [[1, 2], [3, 4], [5, 6], [7, 8], [9, 10], [11, 12], [13, 14], [15, 16]] 

small_list = split_list(big_list, 3) 
print(small_list) 
# [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12], [13, 14, 15]]