Есть ли встроенный python для создания кортежей из нескольких списков?

#python #transpose #list-manipulation #built-in

#python #транспонировать #манипулирование списком #встроенный

Вопрос:

Есть ли встроенный 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)]
  

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

Комментарии:

1. Также взгляните на модуль itertools. itertools.izip() и itertools.izip_longest() возвращают эффективный по объему памяти итератор, достигающий того же результата, что и zip.

Ответ №1:

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

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

Ответ №2:

взгляните на встроенную функцию ziphttp://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)]
  

Ответ №3:

 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]
  

Ответ №4:

Правильный способ — использовать 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)]
>>> 
  

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