将列表项拆分为列并附加到新列表

时间:2015-05-18 15:17:42

标签: python list

我有一个列表,其中每个元素都是长字符串的长字符串:

['KLGNVAGELQPFAPSED', 'MPDNVSFELQPPASJED', 'YYLNVSFEDQPPAPMED']

我想要做的是生成一个新列表,其中每个元素都是来自第一个列表的相同位置的字符串。您还可以想象出与此相同的第一个列表:

KLGNVAGELQPFAPSED
MPDNVSFELQPPASJED
YYLNVSFEDQPPAPMED

所以我希望新列表包含第一个列表中相应列的元素,如下所示:

['KMY', 'LPY', 'GDL' 'NNN', ...]

我试过的是:

for i in sub1:
   for j in i:
      pos.append(j)
   pos.append('\n')

但后来我无法将所有内容分成不同的行。

2 个答案:

答案 0 :(得分:4)

您需要zip列表中的元素,然后将元组作为字符串加入:

new_list = [''.join(i) for i in zip(*old_list)] # KMY, LPY, GDL, ...

答案 1 :(得分:3)

您可以使用mapzip

>>> l = ['KLGNVAGELQPFAPSED', 'MPDNVSFELQPPASJED', 'YYLNVSFEDQPPAPMED']
>>> map(''.join,zip(*l))
['KMY', 'LPY', 'GDL', 'NNN', 'VVV', 'ASS', 'GFF', 'EEE', 'LLD', 'QQQ', 'PPP', 'FPP', 'AAA', 'PSP', 'SJM', 'EEE', 'DDD']

请注意,map比不需要lambda功能的list-comp快。

$ python -m timeit "[''.join(i) for i in zip(*['KLGNVAGELQPFAPSED', 'MPDNVSFELQPPASJED', 'YYLNVSFEDQPPAPMED'])]"
100000 loops, best of 3: 3.54 usec per loop
$ python -m timeit "map(''.join,zip(*['KLGNVAGELQPFAPSED', 'MPDNVSFELQPPASJED', 'YYLNVSFEDQPPAPMED']))"
100000 loops, best of 3: 2.87 usec per loop

您可以查看有关速度差here

的更多信息
  在某些情况下,

地图可能在显微镜下更快(当你不是时   为此目的制作一个lambda,但在map中使用相同的函数   和listcomp)。在其他情况下,列表推导可能更快   大多数(不是全部)pythonistas认为它们更直接,更清晰。