Szukam sposobu na łatwe podzielenie listy Pythona na pół.
Więc jeśli mam tablicę:
A = [0,1,2,3,4,5]
Byłbym w stanie uzyskać:
B = [0,1,2]
C = [3,4,5]
A = [1,2,3,4,5,6]
B = A[:len(A)//2]
C = A[len(A)//2:]
Jeśli chcesz mieć funkcję:
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)
B = A[:(len(A) // 10) * 8]
C = A[(len(A) // 10) * 8:]
Trochę bardziej ogólne rozwiązanie (możesz określić liczbę części, które chcesz, a nie tylko podzielić je na pół):
EDYCJA : zaktualizowany post do obsługi nieparzystych długości list
EDIT2 : ponownie zaktualizuj post na podstawie pouczających komentarzy Briana
źródło
//
oznacza dzielenie liczb całkowitych. Nie należy ich pomijać, ponieważ są one niezbędne do wykonania tej pracy.n
- predefiniowana długość tablic wynikowychźródło
Test:
wynik:
źródło
for i,j in zip(list,lengths): print(split(i,j))
.list
Ilengths
wykazy mają taką samą długość. j jest naprzemiennie: 5,4,5,4,5, a funkcja split działa na dwóch pierwszych przemianach, tj. dzieli pierwsząi
z listy na 5 i 4, ALE w następnej iteracji dzieli ją na 4,4, 1. : \ Proszę o odpowiedź, jeśli chcesz, żebym wyjaśnił więcej (opublikuj nowe pytanie)Jeśli nie zależy Ci na zamówieniu ...
list[::2]
pobiera co drugi element listy, zaczynając od elementu zerowego.list[1::2]
pobiera co drugi element listy, zaczynając od pierwszego elementu.źródło
list
z cieniowaniemlist(...)
wbudowanego. Widziałemlst
ilist_
często używałem, aby tego uniknąć.B,C=A[:len(A)/2],A[len(A)/2:]
źródło
Oto powszechne rozwiązanie, podzielone na część licznikową
źródło
Testowałem i podwójny ukośnik jest wymagany do wymuszenia dzielenia int w Pythonie 3. Mój oryginalny post był poprawny, chociaż z jakiegoś powodu wysiwyg zepsuł się w Operze.
źródło
Istnieje oficjalna recepta na Pythona dla bardziej uogólnionego przypadku podziału tablicy na mniejsze tablice o rozmiarze
n
.Ten fragment kodu pochodzi ze strony dokumentacji python itertools .
źródło
Korzystanie z wycinania list . W zasadzie składnia
my_list[start_index:end_index]
Aby uzyskać pierwszą połowę listy, wycinamy od pierwszego indeksu do
len(i)//2
(gdzie//
jest dzielenie liczby całkowitej - czyli3//2 will give the floored result of
1, instead of the invalid list index of
1,5`):.. i zamień wartości wokół, aby uzyskać drugą połowę:
źródło
3//2
daje wynik tak1
, że otrzymujesz,i[:1]
który daje[0]
ii[1:]
który daje[1, 2]
Jeśli masz dużą listę, lepiej użyć itertools i napisać funkcję, aby uzyskać każdą część w razie potrzeby:
Możesz użyć tego jak:
Wynik to:
Podziękowania dla @thefourtheye i @Bede Constantinides
źródło
10 lat później ... pomyślałem - czemu nie dodać kolejnego:
źródło
Chociaż powyższe odpowiedzi są mniej więcej poprawne, możesz napotkać kłopoty, jeśli rozmiar twojej tablicy nie jest podzielny przez 2, w wyniku tego
a / 2
, że jest nieparzystą, jest zmiennoprzecinkową w Pythonie 3.0, a we wcześniejszej wersji, jeśli określićfrom __future__ import division
na początku skryptu. W każdym razie lepiej jest wybrać dzielenie całkowitoliczbowe, tj.a // 2
W celu uzyskania zgodności kodu "do przodu".źródło
Jest to podobne do innych rozwiązań, ale trochę szybsze.
źródło
Z podpowiedziami @ChristopheD
źródło
źródło
Inne podejście do tego problemu w 2020 roku ... Oto uogólnienie problemu. Interpretuję „podziel listę na pół” jako… (tj. Tylko dwie listy i nie będzie żadnego efektu przeniesienia na trzecią tablicę w przypadku nieparzystej listy itp.). Na przykład, jeśli długość tablicy wynosi 19, a dzielenie przez dwa za pomocą operatora // daje 9, a otrzymamy dwie tablice o długości 9 i jedną (trzecią) o długości 1 (czyli w sumie trzy tablice). Jeśli chcielibyśmy, aby ogólne rozwiązanie dawało dwie tablice przez cały czas, zakładam, że jesteśmy zadowoleni z wynikowych tablic duet, które nie mają równej długości (jedna będzie dłuższa od drugiej). I że założono, że mieszanie zamówienia (naprzemiennie w tym przypadku) jest w porządku.
Ta koncepcja działa dla dowolnej ilości partycji listy, jak chcesz (musiałbyś dostosować kod w zależności od tego, ile części listy chcesz). I jest raczej łatwy do interpretacji. Aby przyspieszyć działanie, możesz nawet napisać tę pętlę w cython / C / C ++, aby przyspieszyć działanie. Z drugiej strony wypróbowałem ten kod na stosunkowo małych listach ~ 10000 wierszy i kończy się w ułamku sekundy.
Tylko moje dwa centy.
Dzięki!
źródło