所以,我有一个清单如下
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中几乎有什么东西可以做到这一点,但似乎无法解决这个问题。
最佳答案
选择1max
+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']
不完全是一行,但什么是蟒蛇毕竟是主观的。
关于python - 寻找所有潜在最长序列的pythonic方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46928922/