我有一个路径列表,我希望它们根据它们来自的文件夹名称动态地划分为它们应该属于的列表.前两个来自"tent1"文件夹,我想把它们放在一个列表中,以此类推.我不想硬编码这些文件夹的名称,然后将路径附加到它们.例如:

paths = [
    '/var/lib/cons/states/tent1/tops-ok_2022_11_28', 
    '/var/lib/cons/states/tent1/tops-ok_2022_11_27',  
    '/var/lib/cons/states/tent2/tops-ok_2022_11_28', 
    '/var/lib/cons/states/tent2/tops-ok_2022_11_27', 
    '/var/lib/cons/states/tent3/tops-ok_2022_11_28', 
    '/var/lib/cons/states/tent3/tops-ok_2022_11_27', 
    '/var/lib/cons/states/tent4/tops-ok_2022_11_28', 
    '/var/lib/cons/states/tent4/tops-ok_2022_11_27',
    ]

我希望他们是这样的:

[['/var/lib/cons/states/tent1/tops-ok_2022_11_28', 
  '/var/lib/cons/states/tent1/tops-ok_2022_11_27'], 
 ['/var/lib/cons/states/tent2/tops-ok_2022_11_28', 
  '/var/lib/cons/states/tent2/tops-ok_2022_11_27'],
 ['/var/lib/cons/states/tent3/tops-ok_2022_11_28', 
  '/var/lib/cons/states/tent3/tops-ok_2022_11_27'],
 ['/var/lib/cons/states/tent4/tops-ok_2022_11_28', 
  '/var/lib/cons/states/tent4/tops-ok_2022_11_27']]

推荐答案

如果您的输入按路径排序(即相同的路径是连续的),则可以使用itertools.groupby:

from itertools import groupby
from os.path import dirname

out = [list(g) for _,g in groupby(paths, dirname)]

如果路径未排序,您可以使用字典作为中间路径:

out = {}
for p in paths:
    (out.setdefault(dirname(p), [])
        .append(p)
    )
    
out = list(out.values())

输出:

[['/var/lib/cons/states/tent1/tops-ok_2022_11_28',
  '/var/lib/cons/states/tent1/tops-ok_2022_11_27'],
 ['/var/lib/cons/states/tent2/tops-ok_2022_11_28',
  '/var/lib/cons/states/tent2/tops-ok_2022_11_27'],
 ['/var/lib/cons/states/tent3/tops-ok_2022_11_28',
  '/var/lib/cons/states/tent3/tops-ok_2022_11_27'],
 ['/var/lib/cons/states/tent4/tops-ok_2022_11_28',
  '/var/lib/cons/states/tent4/tops-ok_2022_11_27']]

alternative with pathlib:

from itertools import groupby
from pathlib import Path

out = [list(g) for _,g in groupby(paths, lambda x: Path(x).parent)]

Python相关问答推荐

替换现有列名中的字符,而不创建新列

计算机找不到已安装的库'

Pandas在rame中在组内洗牌行,保持相对组的顺序不变,

ModuleNotFoundError:Python中没有名为google的模块''

Python日志(log)库如何有效地获取lineno和funcName?

如果服务器设置为不侦听创建,则QWebSocket客户端不连接到QWebSocketServer;如果服务器稍后开始侦听,则不连接

如何在不遇到IndexError的情况下将基数10的整数转换为基数80?

Pandas 数据框自定义排序功能

如何强制SqlalChemy指向与连接字符串的默认架构不同的架构

如何使用aiohttp获取图像并直接处理它而不保存它?

在每个子列表(2D列表)中返回2个以上的重复项

";abc";+5被认为是python中的一个表达式吗?

在Numpy数组中的列子集上聚合

改进积分方程式、Worker关键字非函数拟合的scipy.Integrate.quad_vec性能

生成错误结果的DataFrame.groupby.ank?

在Python中使用xpath和selenium Select HTML元素

基于时间间隔扩展Pandas DataFrame中的行,考虑可选中断

生成所有排列:为什么在递归中产生的值不在输出中?

形状摘要_绘图的子图

删除GeoAxes子图中的顶部和右侧脊椎