【问题标题】:Extract longest strings from sublist within list . Python从列表中的子列表中提取最长的字符串。 Python
【发布时间】:2013-04-05 15:10:16
【问题描述】:

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

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

以下是列表示例

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

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

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

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

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

【问题讨论】:

  • 你不能用正则表达式来做到这一点。正则表达式不是用于比较列表中单独字符串的工具。为什么要在这里避开itertools
  • 输出列表的顺序重要吗?还是只是您要检索长度最长的元素?
  • @MartijnPieters 我不一定要避免使用 itertools,但主要是在表达式中加入 lambda。
  • @g.d.d.c 输出列表的顺序至关重要,因为每个序列都与另一个列表中的某个名称相关联。这就是为什么我也加入了一些空列表

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


【解决方案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']]

【讨论】:

  • 这是干净和简单的。我很困惑,为什么 maxlen 设置为 -1 ?
  • @draconisthe0ry:因此即使是空字符串(长度为 0)也被认为是对初始状态的改进。但是,maxlen = 0 也可以。
【解决方案2】:

这个答案不是最有效的,但很容易理解。

您可以先提取最大长度(这里我使用生成器表达式),然后提取具有这些长度的字符串。

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

【讨论】:

    【解决方案3】:

    我会用下面的(神秘的:))一个班轮来开枪:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-13
      • 1970-01-01
      • 2021-07-02
      • 1970-01-01
      • 2016-03-17
      • 1970-01-01
      • 2017-12-15
      相关资源
      最近更新 更多