Pomoc w zrozumieniu działania kodu

0

Witajcie. Jak polecił mi pewien user tego forum czytam dokumentację Pythona na głównej stronie i napotkałem na problem, którego nie rozumiem.

matrix = [
... [1, 2, 3, 4],
... [5, 6, 7, 8],
... [9, 10, 11, 12],
... ]

Mianowicie, na jakiej zasadzie działa to wyrażenie ? :

[[row[i] for row in matrix] for i in range(4)]
#[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

Wiem, że zestawia ze sobą te liczby jakby w kolumnach (widać u góry na przykładzie) ale nie mogę się dopatrzeć jak to robi. Ktoś mógłby łopatologicznie wyjaśnić ?

P.S - > taki sam wynik otrzymamy :

zip(*matrix)
#[(1, 5, 9), (2, 6, 10), (3, 7, 11), (4, 8, 12)]

Również o zip'a prosiłbym wyjaśnienie na jakiej zasadzie działa ;)

1

To masz stąd: http://docs.python.org/tutorial/datastructures.html#nested-list-comprehensions, więc troszkę wyżej masz właściwie wszystko co potrzebne ;) Nic poza zagnieżdżone pętle

Generujesz listę, wg. "zaleceń"; to co napisałeś możesz sobie rozbić, najpierw "zewnętrzną część":

[i for i in range(4)]

Jeśli to sobie uruchomisz, to otrzymasz listę [0, 1, 2, 3], zgadza się? A teraz jeśli zamiast tego i dasz tam sobie:

[row[i] for row in matrix]

To to tak, jakbyś wywołał to dla kolejnych wartości z wcześniej otrzymanej listy. Czyli będziesz miał cztery najprostsze przypadki:

[row[0] for row in matrix]
[row[1] for row in matrix]
[row[2] for row in matrix]
[row[3] for row in matrix]

Każde z tych wyrażeń wyciąga wartość z podanej kolumny (0,1,2,3) dla każdego kolejnego wiersza. Czyli jakbyś sobie wziął [row[0] for row in matrix] to otrzymasz: [1, 5, 9] itd.

Na upartego to można by sobie przeczytać:
wygeneruj listę | [[row[i] for row in matrix] for i in range(4)]
która jest tworzona wg. danych z pętli | [[row[i] for row in matrix] for i in range(4)]
której kolejnymi elementami będą listy | [[row[i] for row in matrix] for i in range(4)]
zbudowane wg. wyrażenia | [[row[i] for row in matrix] for i in range(4)]
ot, tyle...

zip'a masz też w dokumentacji opisanego zip([1, 2, 3], [4, 5, 6]) da wynik [(1, 4), (2, 5), (3, 6)], czyli bierze z podanych sekwencji to, co na pierwszym miejscu i tworzy krotkę (1, 4), bierze to co na drugiej... itd.

Tam masz jedynie do przeczytania http://docs.python.org/tutorial/controlflow.html#tut-unpacking-arguments

mając:

matrix = [
... [1, 2, 3, 4],
... [5, 6, 7, 8],
... [9, 10, 11, 12],
... ]

uzywasz zip(*matrix) rozpakowując matrix na kolejne elementy; to właściwie mógłbyś sobie zapisać jako:

zip([1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12])
0

Dzięki wszystko jasne ;)

0

Cóż, wybaczcie za post pod postem ale natrafiłem na kolejny kłopot.

print ''.join(re.findall('[^A-Z][A-Z]{3}([a-z])[A-Z]{3}[^A-Z]', text)

Ktoś wytłumaczy na jakiej zasadzie działa ten kod ? Robie zadanka z pythonchellange do 3 zrobiłem bez problemu a z 3 miałem problem <_>

0

Wyrażenie regularne, poczytaj sobie o ich składni i używaniu modułu re w Pythonie. jeśli chodzi o drugą konstrukcję Pythona, to ''.join oznacza tyle, że łączysz wszystkie elementy tupli/listy w jeden string - te elementy, które wyłapuje Ci wyrażenie regularne.

0
Resident napisał(a):

Witajcie. Jak polecił mi pewien user tego forum czytam dokumentację Pythona na głównej stronie...
aby na pewno?

Ponownie - rozbij to sobie..

Najpierw re.findall('[^A-Z][A-Z]{3}([a-z])[A-Z]{3}[^A-Z]', text) - wyszukuje wystąpienia zdefiniowanego wzorca w tekście
http://docs.python.org/library/re.html#finding-all-adverbs
http://docs.python.org/library/re.html#regular-expression-syntax

W tym przypadku ten wzorzec możesz sobie znowu rozpisać tak, że ma wyszukać wystąpienia takiego ciągu, który spełnia wymagania:
[^A-Z] | pierwszy jego znak nie jest "dużą literą"
[A-Z]{3} | po czym następują trzy "duże litery"
([a-z]) | a następnie jedna "mała" - ta z powodu nawiasu będzie wynikiem tego dopasowania
[A-Z]{3} | po czym następują znowu trzy "duże litery"
[^A-Z] | ostatni znak tego ciągu nie jest "dużą literą" - to może być np. a, 2 itp.
W przypadku takiego łańcucha:

text = """1KOTaWALi vMAMsPUTx"""

wynikiem będzie lista ['a', 's'] - popatrz wyżej dlaczego...

czyli masz teraz:

print ''.join(['a', 's'])

No dobra, masz to co w środku, to idziesz sobie do http://docs.python.org/library/stdtypes.html#str.join i patrzysz co robi join, a join po prostu tworzy łańcuch z kolejnych elementów listy, którą otrzymaliśmy rozdzielając poszczególne znaki tym, co jest w podanym łańcuchu - w tym przypadku nic tam nie ma ;) czyli po prostu zostanie stworzony łańcuch będący połączeniem listy - listy, którą otrzymaliśmy w wyniku re.findall - czyli na koniec mamy:

print 'as'

1 użytkowników online, w tym zalogowanych: 0, gości: 1