pythonic方式找到所有潜在的最长序列

时间:2017-10-25 09:36:00

标签: python

所以,我有一个如下列表

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

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

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

是否有任何python内置函数可以做到这一点..我觉得在itertools中几乎有一些东西可以做到这一点,但似乎无法解决这个问题。

2 个答案:

答案 0 :(得分:3)

选项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 毕竟是主观的。

答案 1 :(得分:1)

你可以利用条件做一个简单的列表理解:

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