Ich hätte gerne folgendes:
Code: Alles auswählen
>>> filter_highest([r'a\b\c', r'a\b', r'b\c\d', 'b', r'c\e'])
['a\\b', 'b', 'c\\e']
Code: Alles auswählen
>>> filter_highest([r'a\b\c', r'a\b', r'b\c\d', 'b', r'c\e'])
['a\\b', 'b', 'c\\e']
Für zweiteres kann man dann os.path.commonprefix einsetzenBlackJack hat geschrieben:@Gremlin: Also es sieht so aus, als wenn Du die Pfade erst nach dem ersten/obersten Element gruppieren möchtest und danach den „longest common prefix” in jeder Gruppe suchst.
Code: Alles auswählen
import os
import timeit
def filter_root_directories(dirs):
filtered_dirs = []
while dirs:
path = dirs.pop(0)
search_path = path
if not search_path.endswith(os.sep):
search_path = ''.join((search_path, os.sep))
add = True
for cmp_path in dirs[:]:
if cmp_path.startswith(search_path):
dirs.remove(cmp_path)
else:
if not cmp_path.endswith(os.sep):
cmp_path = ''.join((cmp_path, os.sep))
if search_path.startswith(cmp_path):
add = False
break
if add:
filtered_dirs.append(path)
return filtered_dirs
paths = ['eins\\zwei\\drei\\vier', 'eins\\drei\\zwei', 'zwei',
'zwei\\drei', 'eins\\drei', 'eins\\zwei\\drei', 'sieben']
print filter_root_directories(paths[:])
print timeit.timeit('filter_root_directories(paths[:])',
'from __main__ import filter_root_directories, paths',
number=10)
Code: Alles auswählen
import os
from itertools import groupby
def filter_root_directories(paths):
def get_first_path_element(path):
return path.split(os.path.sep, 1)[0]
return [
os.path.commonprefix(list(path_iter))
for _, path_iter in groupby(sorted(paths), get_first_path_element)
]