从列表中的子列表中提取最长的字符串。蟒蛇

时间:2013-04-05 15:10:16

标签: python string list search greatest-n-per-group

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

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

下面的

是列表的一个例子

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

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

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

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

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

3 个答案:

答案 0 :(得分: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']]

答案 1 :(得分: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

答案 2 :(得分:0)

我会用以下(神秘:) :)给我的镜头一个班轮:

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