2012-04-25 23 views
10

Najpierw proszę wybaczyć mi nieco kiepski tytuł. Nie bardzo wiedziałem, jak to powiedzieć. Jeśli ktoś mógłby zaproponować lepszy tytuł, który byłby świetny.Zrozumienie listy w języku Python Dzielenie zmiennej pętli

Próbuję dowiedzieć się, czy istnieje sposób, aby podzielić wartość każdej iteracji listy zrozumienie tylko raz, ale użyć go dwa razy w danych wyjściowych. Przykładem problemu próbuję rozwiązać jest:

Mam ciąg

a = "1;2;4\n3;4;5" 

I chciałbym, aby wykonać to:

>>> [(x.split(";")[1],x.split(";")[2]) for x in a.split("\n") if x.split(",")[1] != 5] 
[('2', '4'), ('4', '5')] 

bez konieczności docierania podzielone trzykrotnie . Więc coś takiego (co jest oczywiście nieprawidłowa składnia, ale mam nadzieję, że to wystarczy, aby otrzymać wiadomość po drugiej):

[(x[1],x[2]) for x.split(";") in a.split("\n") if x[1] != 5] 

W tej kwestii jestem nie szukają fantazyjnych sposobów na 2. i 3. kolumny łańcucha . To tylko jeden ze sposobów przedstawienia konkretnego przykładu. Mógłbym o kursie dla przykładu użytku:

[x.split(";")[1:3] for x in a.split("\n")] 

Możliwe rozwiązania Myślałem o:

  1. Nie używać wyrażeń listowych
  2. Zostaw go jak
  3. Użyj csv.DictReader , nazwij moje kolumny i coś takiego jak StringIO, aby dać mu dane wejściowe.

Jest to przede wszystkim coś, co byłoby dobrym wzorem do zastosowania, a nie konkretnym przypadkiem, więc trudno jest odpowiedzieć na pytanie "dlaczego chcesz to zrobić" lub "do czego to służy".

góry dzięki :)

UPDATE: Po przeczytaniu rozwiązanie jest poniżej poszedłem i prowadził kilka testów prędkości. I w moich bardzo podstawowych testach odkryłem, że dostarczone rozwiązanie było o 35% szybsze niż powyższe rozwiązanie naiwne.

Odpowiedz

16

Można użyć wyrażeń listowych owiniętą wokół wypowiedzi prądnicy:

[(x[1],x[2]) for x in (x.split(";") for x in a.split("\n")) if x[1] != 5] 
+0

dzięki bardzo fajne :) – Nick

Powiązane problemy