所以,我有一个如下所示的列表
potential_labels = ['foo', 'foo::bar', 'foo::bar::baz', "abc", "abc::cde::def", "bleh"]
The desired_output = ['foo::bar::baz', "abc::cde::def", "bleh"]
这是因为..对于根“foo”,“foo::bar::baz”是最长的序列
对于“abc”、“abc::cde::def”,对于“bleh”,它是“bleh”
有没有任何Python内置函数可以做到这一点..我觉得itertools中几乎有一些东西可以做到这一点,但似乎无法弄清楚这一点。
Option 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']
Option 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毕竟是主观的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)