Мне нужно сделать кортеж из списка из 2 предметов.

Например, если у меня есть список range(10)

Мне нужно сделать кортеж так:

[(0,1),(2,3),(4,5),(6,7),(8,9)]

Как я могу это реализовать?

0
Pol 31 Июл 2010 в 00:03

3 ответа

Лучший ответ

См. рецепт группировщика из itertools документов:

from itertools import izip_longest

def grouper(n, iterable, fillvalue=None):
    """
    >>> grouper(3, 'ABCDEFG', 'x')
    ["ABC", "DEF", "Gxx"]
    """
    args = [iter(iterable)] * n
    return izip_longest(fillvalue=fillvalue, *args)

Это означает, что вы можете:

[(el[0], el[1]) for el in grouper(2, range(10))]

Или в более общем плане:

[(el[0], el[1]) for el in grouper(2, elements)]
2
Tim McNamara 30 Июл 2010 в 20:14

Это также можно сделать с помощью numpy:

import numpy
elements = range(10)

elements = [tuple(e) for e in numpy.array(elements).reshape(-1,2).tolist()]
# [(0, 1), (2, 3), (4, 5), (6, 7), (8, 9)]
0
beitar 30 Июл 2010 в 20:34

Много разных способов. Просто чтобы похвастаться несколькими:

Как понимание списка, где l - последовательность (то есть целочисленные индексы): [(l[i], l[i+1]) for i in range(0,len(l),2)]

Как функция генератора, работает для всех итераций:

def some_meaningful_name(it):
    it = iter(it)
    while True:
        yield next(it), next(it)

Наивно с помощью нарезки списков (отстойная производительность для больших списков) и копирования, опять же используя понимание списка: [pair for pair in zip(l[::2],l[1::2])].

Мне нравится второй вариант, и он, вероятно, самый питонический и общий (и поскольку он является генератором, он работает в постоянном пространстве).

3
30 Июл 2010 в 20:22