将主列表中的类似项分组,并基于分组项创建新列表

2024-09-30 20:17:46 发布

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

我试图从一个主列表创建几个新列表,其中新列表包含来自主列表的类似项。具体地说,我有一张公交线路表。下面是一个示例数据集:

[u'Bus04_00_00_IB_pts_Line', u'Bus04_00_00_OB_pts_Line', u'Bus15_00_00_IB_pts_Line', u'Bus15_00_00_OB_pts_Line']

大多数巴士路线都有一个入站(IB)和一个出站(OB)项目(有些有多个IB和OB,有些只有一条路线,b/c是环形路线)。最后,我想在地图软件中合并IB和OB路由(我已经知道怎么做了)。。。在

我最初创建的文件名是为了让前5个字符代表总线路由,不管它是否是IB还是OB。因此,我可以根据前5个字符对类似的项目进行分组。例如,当我写下:

^{pr2}$

我得到:

>>> 
Bus04
Bus04
Bus15
Bus15

如何将属于Bus04Bus04,以及Bus15和{}的文件“分组”到新列表中,这样我就可以得到:

[u'Bus04_00_00_IB_pts_Line', u'Bus04_00_00_OB_pts_Line']和{}作为单独的列表?在

我的思路是循环遍历每个项目,查看每个项目的前五个字符,然后创建一个新列表,其中包含每个新出现的五个字符的项目(并将该项目添加到新列表中),或者检查列表是否已经存在并将类似的项目附加到该列表中。在

我很难用代码写出来,所以任何帮助都是非常感谢的!在


Tags: 数据项目示例列表line字符路线pts
3条回答

我将使用^{}来进行此操作:

import collections

L = [u'Bus04_00_00_IB_pts_Line', u'Bus04_00_00_OB_pts_Line', u'Bus15_00_00_IB_pts_Line', u'Bus15_00_00_OB_pts_Line']
d = collections.defaultdict(list)
for elem in L:
    d[elem.split('_')[0]].append(elem)
print(dict(d))

这会产生:

^{pr2}$

与迄今为止提出的其他一些解决方案不同的是,这种方法不考虑条目在输入列表中出现的顺序。在

您可以将^{}与自定义键函数一起使用,例如lambda x: x[0:5]。在

下面是一个演示,它为您提供了一个静态列表(即,不仅仅是生成器):

>>> import itertools
>>> lst = [u'Bus04_00_00_IB_pts_Line', u'Bus04_00_00_OB_pts_Line', u'Bus15_00_00_IB_pts_Line', u'Bus15_00_00_OB_pts_Line']
>>> [(key, list(val)) for key, val in itertools.groupby(lst, lambda x: x[0:5])]
Out[9]:
[(u'Bus04', [u'Bus04_00_00_IB_pts_Line', u'Bus04_00_00_OB_pts_Line']),
 (u'Bus15', [u'Bus15_00_00_IB_pts_Line', u'Bus15_00_00_OB_pts_Line'])]
import collections

lists = collections.defaultdict(list)
for item in masterlist:
    lists[item[:5]].append(item)

相关问题 更多 >