То, что вы пытаетесь сделать, это чередование двух последовательностей. Причина, по которой вы видите ошибку, заключается в том, что ascii_username
и ascii_password
не имеют одинаковую длину. Когда вы пытаетесь присвоить фрагменту списка, вы должны указать точное количество элементов в фрагменте.
В этом примере это легко увидеть: нарезка x
при размере шага 2 содержит больше элементов, чем y
.
x = [1, 2, 3, 4, 5, 6, 7, 8]
y = 'yes'
z = 'nope!'
print(x[::2])
# prints:
[1, 3, 5, 7]
print(list(y))
['y', 'e', 's']
При попытке присвоить x[::2]
остается висячий 7
, который не переназначается.
Чтобы решить эту проблему, вы можете использовать interleave_longest
из пакета more_itertools
.
from more_itertools import interleave_longest
list(interleave_longest(x, y))
# returns:
['y', 'n', 'e', 'o', 's', 'p', 'e', '!']
Или, если вы не хотите устанавливать новый пакет, исходный код функции довольно мал.
from itertools import chain, zip_longest
_marker = object()
def interleave_longest(*iterables):
"""Return a new iterable yielding from each iterable in turn,
skipping any that are exhausted.
>>> list(interleave_longest([1, 2, 3], [4, 5], [6, 7, 8]))
[1, 4, 6, 2, 5, 7, 3, 8]
This function produces the same output as :func:`roundrobin`, but may
perform better for some inputs (in particular when the number of iterables
is large).
"""
i = chain.from_iterable(zip_longest(*iterables, fillvalue=_marker))
return [x for x in i if x is not _marker]
interleave_longest(x, y)
# returns:
['y', 'n', 'e', 'o', 's', 'p', 'e', '!']