У меня есть список вроде
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)]