1

所以我有一个子列表列表,在子列表中,有字符串。

字符串通常有不同的长度,但也可以是相同的长度。

以下是列表示例

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

我想找到一种方法从每个列表中提取最长的字符串,如果有两个同样长,那么取这两个字符串

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

通常我会在for循环中设置一个阈值,如果它长于某个长度,则附加到一个列表中,然后在每次迭代后将其附加到一个列表中。. . 但在这种情况下我没有阈值

如果可能的话,我想尽量避免使用 lambda 和函数,因为这将在另一个函数中

4

3 回答 3

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']]
于 2013-04-05T15:16:22.397 回答
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.izipzip在这种情况下更可取。

于 2013-04-05T15:16:37.827 回答
0

我将使用以下(神秘的:))一个班轮来拍摄:

example_output = [list(filter(lambda x: len(x)==len(max(sub_lst, key=len)), sub_lst)) for sub_lst in sequences]
于 2013-04-05T15:28:54.620 回答