Nie mogłem znaleźć żadnego ważnego przykładu w Internecie, w którym widzę różnicę między nimi a tym, dlaczego wybrać jeden nad drugim.Jaka jest różnica między chain a chain.from_iterable w itertools?
Odpowiedz
Pierwszy ma wartość 0 lub więcej argumentów, każdorazowo oznaczają iterowalny, drugi jeden argument która ma do wytworzenia iterables:
itertools.chain(list1, list2, list3)
iterables = [list1, list2, list3]
itertools.chain.from_iterable(iterables)
ale iterables
może być dowolny iteracyjnej, że otrzymuje się iterables.
def generate_iterables():
for i in range(10):
yield range(i)
itertools.chain.from_iterable(generate_iterables())
Korzystanie z drugiego formularza jest zwykle przypadek wygody, ale dlatego, że pętle nad wejściem iterables leniwie, jest to również jedyny sposób można łańcuch nieskończony ilość skończonych iteratorów:
def generate_iterables():
while True:
for i in range(5, 10):
yield range(i)
itertools.chain.from_iterable(generate_iterables())
powyższy przykład daje iterowalny który daje cykliczny wzór numerów, które nigdy nie zatrzyma się, ale nigdy nie zużywa więcej pamięci niż to, co wymaga pojedyncza range()
wezwanie.
Robią bardzo podobne rzeczy. Dla małej liczby iteracji itertools.chain(*iterables)
i itertools.chain.from_iterable(iterables)
działają podobnie.
Główną zaletą from_iterables
jest możliwość obsługi dużej (potencjalnie nieskończonej) liczby iteracji, ponieważ wszystkie z nich nie muszą być dostępne w czasie połączenia.
Nadal nie mogę go pobrać. czy możesz podać różnicę wyjściową i przypadek użycia w praktycznej sytuacji, w której używasz tego, co – user1994660
@ użytkownik1994660: nie ma różnicy wyjściowej. To różnica * wejścia *. Ułatwia korzystanie z niektórych danych wejściowych. –
@ user1994660: Używam drugiego formularza w [tej odpowiedzi] (http://stackoverflow.com/questions/12900444/trying-to-add-to-dictionary-values-by-counting-occurrences-in-a-list -of-list-p/12900577 # 12900577). –