将列表分隔为具有公共前缀和非公共前缀的值

2024-09-25 08:34:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下意见:

['.apple.pie.desc','.apple.pie.bore', '.apple.key.dcx','set.pie.desc']

我希望得到: 获取公共前缀.apple.

['.apple.pie.desc','.apple.pie.bore', '.apple.key.dcx'],['set.pie.desc']

代码: 行={.set.apple.pie.desc':'2','set.apple.pie.bore':'4','set.apple.key.dcx':'3','set.pie.desc':'2'}

res=[itertools.groupby(line.keys(),lambda x:x.rpartition('.')[0])中j和i的列表(i)]

打印(res)-['.set.apple.pie.desc','.set.apple.pie.bore'],['.set.apple.key.dcx'],['set.pie.desc']

但是它应该是[['.set.apple.pie.desc','.set.apple.pie.bore','.set.apple.key.dcx'],['set.pie.desc']


Tags: lambdakey代码applelinereskeysdesc
3条回答

您可以执行以下操作:

import itertools
import re
s = ['.apple.pie.desc','.apple.pie.bore', '.apple.key.dcx','.set.pie.desc']
longest_prefix = ""
for i,j in itertools.groupby(s, lambda x:x.rpartition('.')[0]):
    if len(i.split(".")[1]) > len(longest_prefix):
        longest_prefix = i.split(".")[1]
new_s = [list(b) for _, b in itertools.groupby(s, key=lambda x:bool(re.findall(longest_prefix, x)))]
print(new_s)

输出为:

[['.apple.pie.desc', '.apple.pie.bore', '.apple.key.dcx'], ['set.pie.desc']]

您可以这样做:

l = ['.apple.pie.desc','.apple.pie.bore', '.apple.key.dcx','set.pie.desc']
common_pre , uncommon_pre= [], []
pre = '.apple.'
for value in l:
    common_pre.append(value) if pre in value else uncommon_pre.append(value)

输出:

['.apple.pie.desc', '.apple.pie.bore', '.apple.key.dcx']
['set.pie.desc']

提供最佳性能的方法是使用statistics.mode确定最常用的前缀,使用numpy.array将列表拆分为常用前缀和其他前缀

from statistics import mode 
from numpy import array

li = ['.apple.pie.desc','.apple.pie.bore', '.apple.key.dcx','set.pie.desc']

li_prefix =[el.split('.')[1] for el in li]
most_common_prefix = mode(li_prefix)
li_mask = array(li_prefix)==most_common_prefix

li_common = array(li)[li_mask]
li_other = array(li)[~li_mask]

print(list(li_common))
print(list(li_other))

输出:

['.apple.pie.desc', '.apple.pie.bore', '.apple.key.dcx']
['set.pie.desc']

相关问题 更多 >