Как перебрать все 5 элементов списка и составить из них один кортеж, затем 6-й элемент того же списка, который будет вторым кортежем, - то же самое сделать со следующими 5 элементами и затем с 6-м.

Я читал о

operator.itemgetter ( * элементы)

Я читал также о

массивы

Я думал о чем-то вроде:

first_N_element=[generator.next() for i in range(N)]

Но это не может занять только следующий элемент и повторить точно такую же операцию.

Например, если у вас есть:

l = [1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12],...

Как мы можем составить новый список следующим образом:

new_l = [1,2,3,4,5],[6],[7,8,9,10,11],[12],...
1
Xtigyro 10 Янв 2017 в 01:22

3 ответа

Лучший ответ

Одним из способов достижения этого является использование itertools.chain с выражением понимания списка :

>>> from itertools import chain
>>> l = [1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12]

>>> list(chain(*[[[j[0] for j in l[i:i+5]], l[i+5]] for i in range(0, len(l), 6)]))
[[1, 2, 3, 4, 5], [6], [7, 8, 9, 10, 11], [12]]

Изменить . Согласно комментарию пользователя. Ожидаемое поведение - оборачивать элементы в списке, а не соединять их. В этом случае это можно сделать как:

>>> l = ('qw','er','ty','ui','op','as','df','gh','jk','l','zx','cv')

>>> list(chain(*[(list(chain(l[i:i+5])), [l[i+5]]) for i in range(0, len(l), 6)]))
[['qw', 'er', 'ty', 'ui', 'op'], ['as'], ['df', 'gh', 'jk', 'l', 'zx'], ['cv']]

В этом случае list, упомянутый в вопросе, вернется:

[[[1], [2], [3], [4], [5]], [[6]], [[7], [8], [9], [10], [11]], [[12]]]
3
Moinuddin Quadri 9 Янв 2017 в 23:41

Вы могли бы написать генератор. Обратите внимание, что это не обрабатывает крайние случаи и предполагает, что ваши данные хорошо себя ведут:

>>> def my_gen(sequence):
...   it = iter(sequence)
...   while True:
...     yield [next(it) for _ in range(6)]
...     yield [next(it)]
...
>>> l = range(1, 7*4 +1)
>>> list(my_gen(l))
[[1, 2, 3, 4, 5, 6], [7], [8, 9, 10, 11, 12, 13], [14], [15, 16, 17, 18, 19, 20], [21], [22, 23, 24, 25, 26, 27], [28]]
>>>

Вы можете улучшить это, чтобы соответствовать вашим потребностям. Например, используя from itertools import slice, вы можете иметь дело с «неровными» списками - списками, которые не кратны 7, возвращая вам завершающие биты следующим образом:

>>> def my_gen(sequence):
...   it = iter(sequence)
...   while True:
...     six = list(islice(it, 6))
...     if six:
...       yield six
...     yield [next(it)]
...
>>> l = range(1, 7*4 -3)
>>> list(my_gen(l))
[[1, 2, 3, 4, 5, 6], [7], [8, 9, 10, 11, 12, 13], [14], [15, 16, 17, 18, 19, 20], [21], [22, 23, 24]]
>>>
4
juanpa.arrivillaga 9 Янв 2017 в 22:52

Правильно: вы, вероятно, не хотите делать это с помощью одной операции. Вместо этого используйте пару связанных операций. Обратите внимание, что ваш синтаксис не создает списки: вы оставили самые крайние пары скобок в каждом из ваших операторов назначения списков.

Я оставлю это в цикле, чтобы убедиться, что вы понимаете логику. Вы также можете поместить весь процесс в единый список, но я предполагаю, что вам будет трудно его прочитать.

ord_list = [[i] for i in range(24)]
print ord_list

new_l = []
for n in range(0, len(ord_list)-5, 6):
    new_l += [[ord_list[n+i][0] for i in range(5)]] + [ord_list[n+5]]
print new_l

Выход:

[[0], [1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12], [13], [14], [15], [16], [17], [18], [19], [20], [21], [22], [23]]
[[0, 1, 2, 3, 4], [5], [6, 7, 8, 9, 10], [11], [12, 13, 14, 15, 16], [17], [18, 19, 20, 21, 22], [23]]

Это то, что вам нужно?

1
Prune 9 Янв 2017 в 22:46