Список нарезки python

У меня есть список вроде

myl = ['A','B','C','D','E','F'] #length always even

Теперь мой желаемый результат: 'AB','CD','EF'

Я пробовал

>>> myl = ['A','B','C','D','E','F']
>>> even_pos = myl[::2]
>>> odd_pos = myl[::-2]
>>> odd_pos.reverse()
>>> newlist = zip(even_pos,odd_pos)
>>> for x in newlist:
...     print "".join(list(x))
...
...
AB
CD
EF
>>>

Мне это не нравится, потому что я думаю, что это слишком много.

Итак, есть ли лучший способ достичь моего результата.

Ответ 1

Вы можете сделать это в сжатом виде, используя выражение списка или генератор выражения:

>>> myl = ['A','B','C','D','E','F']
>>> [''.join(myl[i:i+2]) for i in range(0, len(myl), 2)]
['AB', 'CD', 'EF']
>>> print '\n'.join(''.join(myl[i:i+2]) for i in range(0, len(myl), 2))
AB
CD
EF

Вы можете заменить ''.join(myl[i:i+2]) на myl[i] + myl[i+1] для этого конкретного случая, но использование метода ''.join() проще, если вы хотите делать группы из трех или более.

Или альтернатива, которая исходит из документации для zip():

>>> map(''.join, zip(*[iter(myl)]*2))
['AB', 'CD', 'EF']

Ответ 2

Почему ваш метод настолько сложный? Вы могли бы сделать в основном то, что вы сделали, но в одной строке, например:

[ "".join(t) for t in zip(myl[::2], myl[1::2]) ]

Ответ F.J более эффективен.

Ответ 3

Как насчет этого?

>>> ["%s%s" % (myl[c], myl[c+1]) for c in range(0, 6, 2)]
['AB', 'CD', 'EF']

Ответ 4

Я бы, наверное, написал:

[myl[i] + myl[i + 1] for i in xrange(len(myl), step=2)]