Dlatego chcę utworzyć listę, która jest podlistą jakiejś istniejącej listy.
Na przykład,
L = [1, 2, 3, 4, 5, 6, 7]
Chcę utworzyć podmenu li
takie, że li
zawiera wszystkie elementy L
w pozycjach nieparzystych.
Chociaż mogę to zrobić
L = [1, 2, 3, 4, 5, 6, 7]
li = []
count = 0
for i in L:
if count % 2 == 1:
li.append(i)
count += 1
Ale chcę wiedzieć, czy istnieje inny sposób, aby zrobić to samo wydajnie i w mniejszej liczbie kroków.
Odpowiedzi:
Rozwiązanie
Tak, możesz:
I to wszystko. Wynik będzie zawierał elementy umieszczone na następujących pozycjach (
0
oparte na podstawie, więc pierwszy element jest na pozycji0
, drugi na1
itd.):więc wynik (rzeczywiste liczby) będzie:
Wyjaśnienie
Na
[1::2]
końcu jest tylko notacja do wycinania listy. Zwykle ma następującą postać:Gdybyśmy pominęli
start
,0
użyto by domyślnej ( ). Zatem pierwszy element (na pozycji0
, ponieważ indeksy są0
oparte na indeksach ) zostałby wybrany. W tym przypadku wybrany zostanie drugi element.Ponieważ pominięto drugi element, używany jest domyślny (koniec listy). Tak więc lista jest iterowana od drugiego elementu do końca .
Podaliśmy również trzeci argument (
step
), którym jest2
. Co oznacza, że jeden element zostanie wybrany, następny zostanie pominięty i tak dalej ...Podsumowując, w tym przypadku
[1::2]
oznacza:step=2
, więc pomijamy jeden , w przeciwieństwie do tego,step=1
który jest domyślny),EDYCJA : @PreetKukreti podał link do innego wyjaśnienia na temat notacji cięcia list w Pythonie. Zobacz tutaj: Wyjaśnij notację wycinków w Pythonie
Dodatki - zamiana licznika na
enumerate()
W swoim kodzie jawnie tworzysz i zwiększasz licznik. W Pythonie nie jest to konieczne, ponieważ możesz wyliczyć kilka iteracyjnych za pomocą
enumerate()
:Powyższe służy dokładnie temu samemu celowi, co kod, którego używałeś:
Więcej na temat emulacji
for
pętli z licznikiem w Pythonie: Dostęp do indeksu w pętlach „for” w Pythonieźródło
(0,2,4,6)
; wygląda na to, że OP chce indeksów(1,3,5)
, które byłyby podane przez[1,2,3,4,5,6,7][1::2]
.1
).list
wycinania Pythona . Trochę się różni, zwłaszcza, żelist
wycinek nie zachowuje odniesienia do oryginalnej listy (w Numarray musisz jawnie wywołać,.copy()
aby mieć coś, co nie odwołuje się do oryginalnej tablicy). Ale miło jest mieć coś, co może być lepsze dla niektórych czytelników. Czy mógłbyś umieścić ten link w komentarzu, abym mógł zagłosować za nim, a pojawi się on tuż pod odpowiedzią?W przypadku nieparzystych pozycji prawdopodobnie chcesz:
źródło
Lubię listy składane ze względu na ich składnię Math (Set). A co powiesz na to:
Zasadniczo, jeśli wyliczysz na liście, otrzymasz indeks
x
i wartośćy
. To, co tutaj robię, to umieszczanie wartościy
na liście wyników (parzystych lub nieparzystych) i używanie indeksu,x
aby dowiedzieć się, czy ten punkt jest nieparzysty (x%2 != 0
).źródło
Możesz użyć operatora bitowego AND
&
. Zobaczmy poniżej:Operator bitowego AND jest używany z 1, a powód, dla którego działa, ponieważ liczba nieparzysta zapisana w systemie binarnym musi mieć pierwszą cyfrę równą 1. Sprawdźmy
Operacja AND z 1 zwróci tylko 1 (1 w systemie binarnym będzie również mieć ostatnią cyfrę 1), jeśli wartość jest nieparzysta.
Więcej informacji znajdziesz na stronie operatora bitowego języka Python .
PS: Możesz użyć tej metody taktycznie, jeśli chcesz wybrać nieparzyste i parzyste kolumny w ramce danych. Powiedzmy, że współrzędne x i y punktów kluczowych twarzy są podane jako kolumny x1, y1, x2 itd ... Aby znormalizować współrzędne xiy z wartościami szerokości i wysokości każdego obrazu, możesz po prostu wykonać
Nie jest to dokładnie związane z pytaniem, ale dla naukowców zajmujących się danymi i inżynierów wizji komputerowej ta metoda może być przydatna.
Twoje zdrowie!
źródło
list_ = lista (zakres (9)) drukuj (lista_ [1 :: 2])
źródło