Альтернатива для zip в Python 3? - PullRequest
0 голосов
/ 17 июня 2019

Альтернатива для zip в Python 3?

from itertools import zip_longest 
list_1 = [["ele1"],["ele_2"],["ele_3"]]
list_2 = [["ele4"],["ele_5"]]

result = [[x for x in t if x is not None] for t in zip_longest(list_1,list_2)]
print(result)

Я получил вывод как

[[['ele1'], ['ele4']], [['ele_2'], ['ele_5']], [['ele_3']]]

Ожидаемый вывод:

[['ele1'], ['ele4']], [['ele_2'], ['ele_5']], [['ele_3']]

Ответы [ 2 ]

0 голосов
/ 17 июня 2019

Вы также можете собрать два (или более) списков в другом списке и использовать понимание вложенного списка, чтобы эмулировать поведение zip_longest.

>>> lists = [list_1, list_2] # an also be more than two lists
>>> [[lst[i] for lst in lists if i < len(lst)]
...  for i in range(max(map(len, lists)))]
...
[[['ele1'], ['ele4']], [['ele_2'], ['ele_5']], [['ele_3']]]

(И если вы поменяете max наmin в вышеприведенном выражении вы получите zip.)

Если вы хотите напечатать результат без крайних значений [...]:

>>> print(', '.join(map(str, _)))                                          
[['ele1'], ['ele4']], [['ele_2'], ['ele_5']], [['ele_3']]
0 голосов
/ 17 июня 2019

Если вы хотите избежать использования архивирования обоих списков, я бы сделал это путем добавления значений из обоих списков в предложении try / except и добавления значений из list_2 (или list_1). если это был самый короткий из обоих), определенный как итератор, избегая таким образом необходимости zip обоих списков при итерации:

# iterate over the longest list. Define other as iterator
l2 = iter(list_2)
out = [[] for _ in range(len(list_1))]
for ix, i in enumerate(list_1): 
    try:
        out[ix].append(i)
        out[ix].append(next(l2))
    except StopIteration:
        break

Дает:

print(out)
[[['ele1'], ['ele4']], [['ele_2'], ['ele_5']], [['ele_3']]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...