Zapętlanie się po liście w Pythonie

177

Mam listę z podlistami. Chcę wydrukować wszystkie podlisty o długości równej 3.

W Pythonie wykonuję następujące czynności:

for x in values[:]:
    if len(x) == 3:
        print(x)

valuesto oryginalna lista. Czy powyższy kod wyświetla każdą podlistę o długości równej 3 dla każdej wartości x? Chcę wyświetlić podlisty length == 3tylko raz.

Problem jest rozwiązany. Problem dotyczy edytora Eclipse. Nie rozumiem powodu, ale po uruchomieniu pętli wyświetla tylko połowę mojej listy.

Czy są jakieś ustawienia, które muszę zmienić w Eclipse?

user1188821
źródło
1
Czy możesz to zrobić print valuesi pokazać tutaj wynik? edytuj: lub po prostu sprawdź, czy nie jest puste.
Brigand
1
Najlepsza odpowiedź: stackoverflow.com/a/28072982/4561887
Gabriel Staples

Odpowiedzi:

196

Spróbuj tego,

x in mylistjest lepszy i bardziej czytelny niż, x in mylist[:]a Twój len(x)powinien być równy 3.

>>> mylist = [[1,2,3],[4,5,6,7],[8,9,10]]
>>> for x in mylist:
...      if len(x)==3:
...        print x
...
[1, 2, 3]
[8, 9, 10]

lub jeśli potrzebujesz więcej Pythona, użyj list-comppressions

>>> [x for x in mylist if len(x)==3]
[[1, 2, 3], [8, 9, 10]]
>>>
RanRag
źródło
15

Równie dobrze możesz użyć for x in valueszamiast for x in values[:]; ta ostatnia tworzy niepotrzebną kopię. Oczywiście kod sprawdza również długość 2 zamiast 3 ...

Kod drukuje tylko jeden element na wartość x- i xiteruje po elementach values, którymi są listy podrzędne. Dlatego każdą podlistę drukuje tylko raz.

comex
źródło
4
wartości [:] wycina wszystkie elementy wartości, prawda? Zakładam, że miałeś na myśli tymczasową listę utworzoną z wycinania. Chcę się tylko upewnić.
batbrat
1
Dziękuję za wspomnienie o niechcianej kopii. @batbrat nie wycina się, odcina, mam na myśli to, że wartości są zduplikowane i nadal są values.
AsTeR
Dzięki za wytłumaczenie.
batbrat
14

Oto rozwiązanie, którego szukałem. Jeśli chcesz utworzyć List2, który zawiera różnicę w liczbie elementów w List1.

list1 = [12, 15, 22, 54, 21, 68, 9, 73, 81, 34, 45]
list2 = []
for i in range(1, len(list1)):
  change = list1[i] - list1[i-1]
  list2.append(change)

Zauważ, że podczas gdy len(list1)jest 11 (elementów), len(list2)będzie tylko 10 elementów, ponieważ zaczynamy naszą pętlę for od elementu o indeksie 1 na liście1, a nie od elementu o indeksie 0 na liście1

Kean Amaral
źródło
To było to, czego potrzebowałem, ponieważ musiałem zacząć od indeksu 1, a nie od 0. +1
timv
1

Zrób to zamiast tego:

values = [[1,2,3],[4,5]]
for x in values:
    if len(x) == 3:
       print(x)
Aaditya Shah
źródło