簡體   English   中英

從列表生成子列表

[英]Generate Sublist from List

我想將一個列表分成多個子列表。 例如

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)] ,然后切片列表。 但這好像是用大錘敲開堅果。

您可以使用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']]

嘗試以下列表理解:

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']]

以下是使用reduce的一種解決方案。

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, []))

輸出:

[['Met', 'Phe', 'Pro', 'Ala', 'Ser'], ['Met', 'Ser', 'Gly', 'Gly'], ['Met', 'Thr', 'Trp']]
[Finished in 0.204s]

您可以使用熊貓:

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']]

如果范圍是固定的,則通常可以使用拼接來實現目標。 [amino[:5],amino[5:9],amino[9:12]]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM