def partition(n, iterable):
p = izip_longest(*([iter(iterable)] * n))
r = []
for x in p:
print(x) #I added this
s = set(x)
s.discard(None)
r.append(list(s))
return r
To jest właściwie praca, która została zamieszczona na SO i jest nowicjuszem. Myślałem, że to interesujące. Więc masz wyjścia jak następuje:Do czego służy ta funkcja? (Python iterators)
partition(5, L)
(1, 2, 3, 4, None)
Out[86]: [[1, 2, 3, 4]]
Dla mnie to już jest mylące, ponieważ myślałem izip_longest(*([iter(iterable)] * n))
by uruchomić funkcję izip_longest
na liście n identycznych iteratorów więc spodziewałem się pierwsze wyjście z (1,1,1,1,1)
a potem wyjście z (2,2,2,2,2)
i tak dalej.
tak krótka wersja moje pytanie, jest to, co dzieje się z tej linii:
p = izip_longest(*([iter(iterable)] * n))
Przetwarzanie to bym myślał [iter (iterable)] * n tworzy listę długości n identycznych iterables wszystkich wskazując na to samo - tak robi się z linii poleceń, ale nie wydaje się, żeby to było to, co tu robi, na podstawie wydruków wydrukowanych powyżej.
Również myślałem, że * na początku ...longest(*...
był tam, ponieważ lista ma nieznaną długość, ale nie sądzę, że to ma sens. Co to jest pierwszy symbol *
podczas wywoływania funkcji? Nie wygląda na to, że po prostu wskazuje na nieznaną długość listy argumentów ...
Tak więc pod koniec dnia jestem kompletnie zagubiony. Czy ktoś może przeprowadzić mnie przez tę składnię?
Wielkie dzięki za wszelkie dane wejściowe!
Dziękuję za wszystkie pomocne odpowiedzi, wszystkim. Nie jestem pewien, czy zajmuję się tutaj odpowiedzią lub pytaniem, ale wydaje mi się, że ta lista będzie rozumiała to samo dla list i krotek (zdaję sobie sprawę, że iteratory miałyby zastosowanie również do słowników, klas niestandardowych, innych rzeczy ... .)
[L[i*n:(i+1)*n] for i in range(int(ceil(len(L)/float(n)))) ]
Czytałeś [Jak 'zip (* [iter (s)] * n)' praca w Pythonie] (http://stackoverflow.com/questions/2233204/how- does-zipitersn-work-in-python)? –
łamie dużą listę na N mniejszych list .... wypełniając Brak w przypadku, gdy długość listy nie jest podzielna równomiernie przez N ... jedyną podlistą, która powinna zawierać dowolne "Brak" jest ostatnia lista –
Dodaj 'print (list (p))', aby zobaczyć, co zrobił 'izip_longest()'. – martineau