2013-09-04 3 views
2

Я хочу знать, если есть способ ускорить функцию, показанную здесь. Я знаю, что это выглядит не очень pythonic ...Ускорьте функцию в Python 2.7

def MakePairs(inputlist): 
    ''' 
    @param inputlist: [[["a","b","c"],["d","e","f"]],[["g","h","i"],["j","k","l"]],...] 
    @return returnlist: [[["a","d"],["b","e],["c","f"]],[["g","j"],["h","k"],["i","l"]],...] 
    ''' 
    returnlist = [] 
    for Pair in xrange(len(inputlist)): 
     dummy2 = [] 
     for item in xrange(len(inputlist[Pair][0])): 
      dummy = [Pair[0][item], Pair[1][item]] 
      dummy2.append(dummy) 
     returnlist.append(dummy2) 

    return returnlist 

Редактировать: пары в возвратном списке должны быть списками.

Заранее благодарен!

+0

Вам не хватает закрытия] после '[" g "," h "," i "]'? –

+1

Помимо других ответов, обратите внимание, что вы можете упростить свои циклы, используя 'for pair in inputlist'. Здесь 'pair' - ваш' inputlist [Pair] ' – joaquin

ответ

4

выглядит как работа для zip():

>>> l = [[["a","b","c"],["d","e","f"]],[["g","h","i"],["j","k","l"]]] 
>>> [zip(*item) for item in l] 
[[('a', 'd'), ('b', 'e'), ('c', 'f')], [('g', 'j'), ('h', 'k'), ('i', 'l')]] 

Таким образом, ваша функция будет:

def MakePairs(inputlist): 
    return [zip(*item) for item in inputlist] 

Кроме того, рекомендуется использовать itertools.izip() вместо почтового индекса().

+0

Я как раз собирался опубликовать это. –

+0

@ g.d.d.c Да, первая мысль пришла в голову, да? :) – alecxe

+0

Да. Я приостановился из-за уровня вложенности в примере ввода ... Я должен был удостовериться, что не упустил какое-то нестандартное спаривание, которое было в ожидаемом выходе. –

Смежные вопросы