所以我有一个子列表列表,在子列表中,有字符串。
字符串通常有不同的长度,但也可以是相同的长度。
下面的是列表的一个例子
sequences = [['aaa'],['aaaa','bb'],[],['aaaaaa','bb','cccccc']]
我想找到一种从每个列表中提取LONGEST字符串的方法,如果有两个同样长的字符串,那么请同时使用这两个字符串
example_output = [['aaa'],['aaaa'],[],['aaaaaa','cccccc']]
通常我会在for循环中设置一个阈值,如果它长于某个长度,则追加到列表然后在每次迭代后将其附加到列表中。 。 。但在这种情况下我没有阈值
如果可能的话我想尝试避免使用lambda和函数,因为这将在另一个函数中
答案 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]