【问题标题】:Sublist filenames based on parent folder and partially similar names基于父文件夹和部分相似名称的子列表文件名
【发布时间】:2022-01-14 10:24:27
【问题描述】:

我有以下清单:

mesh_files = ['../data/Tombstone1.obj', '../data/Tombstone1_p1.obj', '../data/Tombstone1_p2.obj', '../data/Tombstone2.obj', '../data/box_8/frag_1__final.ply', '../data/box_8/frag_1_final.ply', '../data/box_8/frag_2__final.ply', '../data/box_8/frag_2_final.ply', '../data/box_8/frag_3__final.ply', '../data/box_8/frag_3_final.ply', '../data/frag_1__final.ply', '../data/frag_1_final.ply', '../data/parasaurolophus_6700.ply']

print('\n'.join(mesh_files))
../data/Tombstone1.obj
../data/Tombstone1_p1.obj
../data/Tombstone1_p2.obj
../data/Tombstone2.obj
../data/box_8/frag_1__final.ply
../data/box_8/frag_1_final.ply
../data/box_8/frag_2__final.ply
../data/box_8/frag_2_final.ply
../data/box_8/frag_3__final.ply
../data/box_8/frag_3_final.ply
../data/frag_1__final.ply
../data/frag_1_final.ply
../data/parasaurolophus_6700.ply

是否有一种快速/直接的方法可以将上述列表拆分为以下子列表:

[['../data/Tombstone1.obj', '../data/Tombstone1_p1.obj', '../data/Tombstone1_p2.obj'], 
['../data/Tombstone2.obj'], 
['../data/box_8/frag_1__final.ply', '../data/box_8/frag_1_final.ply'], 
['../data/box_8/frag_2__final.ply', '../data/box_8/frag_2_final.ply'], 
['../data/box_8/frag_3__final.ply', '../data/box_8/frag_3_final.ply'], 
['../data/frag_1__final.ply', '../data/frag_1_final.ply'], 
['../data/parasaurolophus_6700.ply']]

在我看来,我会将父文件夹和部分文件名视为条件。但是,我想避免 for 循环。

谢谢。

【问题讨论】:

  • 您可以尝试使用mapfilter 等函数,但它也是某种类型的循环,但您看不到此循环。

标签: python list text split sublist


【解决方案1】:

你可以使用递归:

import re, collections
def group(d, p=[]):
   c = collections.defaultdict(list)
   for a, *b in d:
      c[a].append(b)
   for a, b in c.items():
      if any(len(i) == 1 for i in b):
         v = [x for y in b for x in ([p+[a]+y] if len(y)==1 else group([y],p+[a]))]
         yield [j for k in v for j in ([k] if all(isinstance(i, str) for i in k) else k)]
      else:
         yield from group(b, p+[a])

mesh_files = ['../data/Tombstone1.obj', '../data/Tombstone1_p1.obj', '../data/Tombstone1_p2.obj', '../data/Tombstone2.obj', '../data/box_8/frag_1__final.ply', '../data/box_8/frag_1_final.ply', '../data/box_8/frag_2__final.ply', '../data/box_8/frag_2_final.ply', '../data/box_8/frag_3__final.ply', '../data/box_8/frag_3_final.ply', '../data/frag_1__final.ply', '../data/frag_1_final.ply', '../data/parasaurolophus_6700.ply']
r = list(group([re.findall('[a-zA-Z0-9]+', i) for i in mesh_files]))
n = iter(mesh_files)
result = [[next(n) for _ in k] for k in r]

输出:

[['../data/Tombstone1.obj', '../data/Tombstone1_p1.obj', '../data/Tombstone1_p2.obj'], 
 ['../data/Tombstone2.obj'], 
 ['../data/box_8/frag_1__final.ply', '../data/box_8/frag_1_final.ply'], 
 ['../data/box_8/frag_2__final.ply', '../data/box_8/frag_2_final.ply'], 
 ['../data/box_8/frag_3__final.ply', '../data/box_8/frag_3_final.ply'], 
 ['../data/frag_1__final.ply', '../data/frag_1_final.ply'], 
 ['../data/parasaurolophus_6700.ply']]

【讨论】:

  • 感谢您的回答,它似乎工作得很好。您能否详细说明一下背后的想法。此外,我有一个用例场景,在初始列表中我还有以下额外文件名[..., '../data/box_11/frag_4__final.ply', '../data/box_11/frag_4_final.ply', '../data/box_11/frag_4a_final.ply'],这给了我两个子列表,而我只想有一个,即[[...], [...], ['../data/box_11/frag_4__final.ply', '../data/box_11/frag_4_final.ply', '../data/box_11/frag_4a_final.ply']]。能否以某种方式解决这个问题。谢谢。
猜你喜欢
  • 2017-06-29
  • 1970-01-01
  • 1970-01-01
  • 2018-10-16
  • 1970-01-01
  • 2018-08-21
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多