【问题标题】:pythonic way to find all potential longest sequence查找所有潜在最长序列的pythonic方法
【发布时间】:2018-04-06 08:05:10
【问题描述】:

所以,我有一个如下列表

potential_labels = ['foo', 'foo::bar', 'foo::bar::baz', "abc", "abc::cde::def", "bleh"]

desired_output = ['foo::bar::baz', "abc::cde::def", "bleh"]

这是因为.. 对于根 "foo",'foo::bar::baz' 是最长的序列 对于“abc”,“abc::cde::def”,对于“bleh”它是“bleh”

是否有任何 python 内置函数可以做到这一点。我觉得 itertools 中几乎有一些东西可以做到这一点,但似乎无法弄清楚。

【问题讨论】:

    标签: python


    【解决方案1】:

    选项 1
    max + groupby 应该这样做。

    r = [max(g, key=len) for _, g in \
              itertools.groupby(data, key=lambda x: x.split('::')[0])]
    
    r
    ['foo::bar::baz', 'abc::cde::def', 'bleh']
    

    选项 2
    一个更简单的解决方案将涉及collections.OrderedDict

    from collections import OrderedDict
    
    o = OrderedDict()    
    for x in data:
        o.setdefault(x.split('::')[0], []).append(x)
    
    r = [sorted(o[k], key=len)[-1] for k in o]
    
    r
    ['foo::bar::baz', 'abc::cde::def', 'bleh']
    

    不完全是单行,但 pythonic 是什么毕竟是主观的。

    【讨论】:

    • 效率只有 log(n) 倍;无论如何,您都需要遍历列表,可能两次(1)获取 maxlen,(2)提取值。
    • @ReblochonMasque 谢谢,内容丰富。我可以考虑用循环和字典来做这件事,这可能会加快速度。
    • OP 要求一种 Python 的方式,而你的答案就是这样。
    • @cᴏʟᴅsᴘᴇᴇᴅ 我认为您可以使用max 而不是sorted,例如[max(list(g), key=len) for ...]
    • @pylang 是的,绝对是。想知道为什么我没有看到。谢谢。
    【解决方案2】:

    您可以利用条件进行简单的列表推导:

    >>> [label for label in potential_labels if "\0".join(potential_labels).count("\0{}".format(label))==1]
    ['foo::bar::baz', 'abc::cde::def', 'bleh']
    

    【讨论】:

    • 如果potential_labels=[u'Reggae', u'Reggae::Dancehall', u'Reggae::Reggae-Pop', u'Reggae::Contemporary Reggae', u'Reggae::Ragga', u'Reggae', u'Reggae::Dancehall', u'Reggae::Reggae-Pop', u'Reggae::Contemporary Reggae', u'Reggae::Ragga']这不起作用
    猜你喜欢
    • 1970-01-01
    • 2017-07-08
    • 1970-01-01
    • 2020-02-20
    • 1970-01-01
    • 1970-01-01
    • 2012-03-22
    • 2021-10-17
    • 1970-01-01
    相关资源
    最近更新 更多