Есть ли встроенный Python для создания кортежей из нескольких списков? - PullRequest
7 голосов
/ 13 апреля 2011

Есть ли встроенная функция Python, которая выполняет те же функции, что и tupler для набора списков, или что-то подобное:

def tupler(arg1, *args):
    length = min([len(arg1)]+[len(x) for x in args])
    out = []
    for i in range(length):
        out.append(tuple([x[i] for x in [arg1]+args]))
    return out

, например,

tupler([1,2,3,4],[5,6,7])

возвращает:

[(1,5),(2,6),(3,7)]

или, может быть, есть правильный способ питонии, или генератор подобный ???

Ответы [ 4 ]

15 голосов
/ 13 апреля 2011

Я думаю, что вы ищете zip():

>>> zip([1,2,3,4],[5,6,7])
[(1, 5), (2, 6), (3, 7)]
5 голосов
/ 13 апреля 2011

взгляните на встроенную функцию zip http://docs.python.org/library/functions.html#zip

он также может обрабатывать более двух списков, скажем, n, а затем создает n-кортежей.

>>> zip([1,2,3,4], [5,6,7,8], [9,10,11,12], [13,14])
 [(1, 5, 9, 13), (2, 6, 10, 14)]
2 голосов
/ 13 апреля 2011
zip([1,2,3,4],[5,6,7])

--->[(1,5),(2,6),(3,7)]


args = [(1,5),(2,6),(3,7)]

zip(*args)

--->[1,2,3],[5,6,7]
0 голосов
/ 13 апреля 2011

Правильным способом является использование функции zip.

В качестве альтернативы мы можем использовать списки и встроенную функцию enumerate
для достижения того же результата.

>>> L1 = [1,2,3,4]
>>> L2 = [5,6,7]
>>> [(value, L2[i]) for i, value in enumerate(L1) if i < len(L2)]
[(1, 5), (2, 6), (3, 7)]
>>> 

Недостаток в приведенном выше примере заключается в том, что мы не всегда перебираем список с минимальной длиной.

...