从列表

时间:2018-03-23 19:54:34

标签: python

我想将列表拆分为一个子列表列表。 E.g。

amino = ['Met','Phe','Pro','Ala','Ser','Met','Ser','Gly','Gly','Met','Thr','Trp']

应该导致

amino_split = [['Met','Phe','Pro','Ala','Ser'],['Met','Ser','Gly','Gly'],['Met','Thr','Trp']]

我的第一个想法是获取'Met'的所有索引并构建范围类似的元组[(0, 4), (5, 8), (9, 11)],然后对列表进行切片。但这似乎是用大锤来破解坚果......

5 个答案:

答案 0 :(得分:1)

您可以使用itertools.groupby

import itertools
amino = ['Met','Phe','Pro','Ala','Ser','Met','Ser','Gly','Gly','Met','Thr','Trp']
final_vals = [list(b) for _, b in itertools.groupby(amino, key=lambda x:x == 'Met')]
last_data = [final_vals[i]+final_vals[i+1] for i in range(0, len(final_vals), 2)]

输出:

[['Met', 'Phe', 'Pro', 'Ala', 'Ser'], ['Met', 'Ser', 'Gly', 'Gly'], ['Met', 'Thr', 'Trp']]

答案 1 :(得分:1)

试试这个列表理解:

w = []
[w.append([]) or w[-1].append(e) if 'Met' in e else w[-1].append(e) for e in amino]

输出(在w中):

[['Met', 'Phe', 'Pro', 'Ala', 'Ser'],
 ['Met', 'Ser', 'Gly', 'Gly'],
 ['Met', 'Thr', 'Trp']]

答案 2 :(得分:1)

以下是使用reduce的一种解决方案。

elinoi-php-fpm

输出:

import functools
amino = ['Met','Phe','Pro','Ala','Ser','Met','Ser','Gly','Gly','Met','Thr','Trp']
print(functools.reduce(lambda pre, cur: pre.append([cur]) or pre if cur == 'Met' else pre[-1].append(cur) or pre, amino, []))

答案 3 :(得分:1)

您可以使用Pandas:

import pandas as pd
amino = ['Met','Phe','Pro','Ala','Ser','Met','Ser','Gly','Gly','Met','Thr','Trp']
s = pd.Series(amino)
s.groupby(s.eq('Met').cumsum()).apply(list).tolist()

输出:

[['Met', 'Phe', 'Pro', 'Ala', 'Ser'],
 ['Met', 'Ser', 'Gly', 'Gly'],
 ['Met', 'Thr', 'Trp']]

答案 4 :(得分:0)

如果范围已修复,那么您通常可以使用拼接来实现目标。 前; [amino[:5],amino[5:9],amino[9:12]]