mirror of
https://github.com/satwikkansal/wtfpython
synced 2024-11-22 11:04:25 +01:00
Translate Lossy zip of iterators example
This commit is contained in:
parent
e8cd593e62
commit
3df9d0e4e3
50
translations/README-ru.md
vendored
50
translations/README-ru.md
vendored
@ -2180,3 +2180,53 @@ for idx, item in enumerate(list_4):
|
|||||||
* Также посмотрите на похожий пример на [StackOverflow](https://stackoverflow.com/questions/45877614/how-to-change-all-the-dictionary-keys-in-a-for-loop-with-d-items), связанный со словарями.
|
* Также посмотрите на похожий пример на [StackOverflow](https://stackoverflow.com/questions/45877614/how-to-change-all-the-dictionary-keys-in-a-for-loop-with-d-items), связанный со словарями.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
||||||
|
### ▶ Сжатие итераторов с потерями *
|
||||||
|
<!-- Example ID: c28ed154-e59f-4070-8eb6-8967a4acac6d --->
|
||||||
|
|
||||||
|
```py
|
||||||
|
>>> numbers = list(range(7))
|
||||||
|
>>> numbers
|
||||||
|
[0, 1, 2, 3, 4, 5, 6]
|
||||||
|
>>> first_three, remaining = numbers[:3], numbers[3:]
|
||||||
|
>>> first_three, remaining
|
||||||
|
([0, 1, 2], [3, 4, 5, 6])
|
||||||
|
>>> numbers_iter = iter(numbers)
|
||||||
|
>>> list(zip(numbers_iter, first_three))
|
||||||
|
[(0, 0), (1, 1), (2, 2)]
|
||||||
|
# пока все хорошо, сожмем оставшуюся часть итератора
|
||||||
|
>>> list(zip(numbers_iter, remaining))
|
||||||
|
[(4, 3), (5, 4), (6, 5)]
|
||||||
|
```
|
||||||
|
Куда пропал элемент `3` из списка `numbers`?
|
||||||
|
|
||||||
|
#### 💡 Объяснение:
|
||||||
|
|
||||||
|
- Согласно [документации](https://docs.python.org/3.12/library/functions.html#zip), примерная реализация функции `zip` выглядит так,
|
||||||
|
```py
|
||||||
|
def zip(*iterables):
|
||||||
|
sentinel = object()
|
||||||
|
iterators = [iter(it) for it in iterables]
|
||||||
|
while iterators:
|
||||||
|
result = []
|
||||||
|
for it in iterators:
|
||||||
|
elem = next(it, sentinel)
|
||||||
|
if elem is sentinel: return
|
||||||
|
result.append(elem)
|
||||||
|
yield tuple(result)
|
||||||
|
```
|
||||||
|
- Таким образом, функция принимает произвольное количество итерируемых объектов, добавляет каждый из их элементов в список `result`, вызывая для них функцию `next`, и останавливается всякий раз, когда любой из итерируемых объектов исчерпывается.
|
||||||
|
- Нюанс заключается в том, что при исчерпании любого итерируемого объекта существующие элементы в списке `result` отбрасываются. Именно это произошло с `3` в `numbers_iter`.
|
||||||
|
- Правильный способ выполнения вышеописанных действий с помощью `zip` будет следующим,
|
||||||
|
```py
|
||||||
|
>>> numbers = list(range(7))
|
||||||
|
>>> numbers_iter = iter(numbers)
|
||||||
|
>>> list(zip(first_three, numbers_iter))
|
||||||
|
[(0, 0), (1, 1), (2, 2)]
|
||||||
|
>>> list(zip(remaining, numbers_iter))
|
||||||
|
[(3, 3), (4, 4), (5, 5), (6, 6)]
|
||||||
|
```
|
||||||
|
Первый аргумент сжатия должен иметь наименьшее число элементов
|
||||||
|
|
||||||
|
---
|
||||||
|
Loading…
Reference in New Issue
Block a user