2013-04-05 122 views
1

所以我有一個列表子列表和子列表內,有字符串。從列表中的子列表中提取最長的字符串。 Python

這些琴絃通常長度不同,但長度也可以相同。

下面

是列表的例子

sequences = [['aaa'],['aaaa','bb'],[],['aaaaaa','bb','cccccc']] 

我想找到一種方法,從每個列表中提取最長的字符串,如果有兩個是同樣長,然後取這兩個字符串

example_output = [['aaa'],['aaaa'],[],['aaaaaa','cccccc']] 

通常我會在for循環中設置一個閾值,如果它長於某個長度,那麼會附加到列表中,然後在每次迭代之後將其附加到列表中。 。 。但我不要在此情況下,有一個閾值

如果可能的話我想盡量避免使用lambda和功能,因爲這將是另一個函數內

+1

你不能用正則表達式做到這一點。正則表達式不是用於比較列表中單獨字符串的工具。你爲什麼要在這裏避免'itertools'? – 2013-04-05 15:13:45

+0

輸出列表的順序是否重要?或者只是你正在檢索最長的元素? – 2013-04-05 15:14:56

+0

@MartijnPieters我不一定試圖避免使用itertools,但主要是在表達式中加入lambda。 – 2013-04-05 15:39:11

回答

1

您可以使用最長的字符串的長度迄今被視爲閾值(maxlen在下面的代碼):

def get_longest(seq): 
    maxlen = -1 
    ret = [] 
    for el in seq: 
     if len(el) > maxlen: 
      ret = [el] 
      maxlen = len(el) 
     elif len(el) == maxlen: 
      ret.append(el) 
    return ret 

sequences = [['aaa'],['aaaa','bb'],[],['aaaaaa','bb','cccccc']] 
example_output = list(map(get_longest, sequences)) 
print(example_output) 

這產生:

[['aaa'], ['aaaa'], [], ['aaaaaa', 'cccccc']] 
+0

這是乾淨和簡單。我很困惑,爲什麼maxlen設置爲-1? – 2013-04-05 15:48:22

+0

@ draconisthe0ry:這樣即使是一個空字符串(長度爲0)被認爲是對初始狀態的改進。但是,'maxlen = 0'也可以。 – NPE 2013-04-05 15:49:38

0

這個答案不是最高效的,但容易理解。

您可以首先提取最大長度(這裏我使用了一個生成器表達式),然後提取這些長度的字符串。

lengths = (max(len(s) for s in sublist) if sublist else 0 for sublist in sequences) 
[ [ s for s in sublist if len(s) == l ] for l, sublist in zip(lengths, sequences) ] 
-> [['aaa'], ['aaaa'], [], ['aaaaaa', 'cccccc']] 

itertools.izip超過在這種情況下zip優選。

0

我給我的投籃有以下(神祕的:))一個班輪:

example_output = [list(filter(lambda x: len(x)==len(max(sub_lst, key=len)), sub_lst)) for sub_lst in sequences] 
相關問題