所以,我有一个如下列表
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中几乎有一些东西可以做到这一点,但似乎无法解决这个问题。
答案 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']