[英]What is the Pythonic way to find the longest common prefix of a list of lists?
[英]pythonic way to find all potential longest sequence
因此,我有一個類似以下的列表
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中幾乎有某些功能可以執行此操作,但似乎無法弄清楚。
選項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畢竟是主觀的。
您可以利用條件進行簡單的列表理解:
>>> [label for label in potential_labels if "\0".join(potential_labels).count("\0{}".format(label))==1]
['foo::bar::baz', 'abc::cde::def', 'bleh']
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.