Если все пути выглядят как в вашем примере, это будет работать:
counts = {}
for p in paths:
parts = p.split('/')
branch = counts
for part in parts[1:-1]:
branch = branch.setdefault(part, {})
branch[parts[-1]] = 1 + branch.get(parts[-1], 0)
При этом используются методы словаря, такие как setdefault()
и get()
, чтобы избежать необходимости писать много операторов if.
Обратите внимание, что это не будет работать, если путь с подкаталогами также может отображаться сам по себе. Тогда не ясно, должна ли соответствующая часть counts
содержать номер или другой словарь. В этом случае, вероятно, было бы лучше сохранить и количество, и число для каждого узла, используя кортеж или пользовательский класс.
Основной алгоритм остается прежним:
class Stats(object):
def __init__(self):
self.count = 0
self.subdirs = {}
counts = Stats()
for p in paths:
parts = p.split('/')
branch = counts
for part in parts[1:]:
branch = branch.subdirs.setdefault(part, Stats())
branch.count += 1
С красивой печатью вы получаете:
def printstats(stats, indent=''):
print indent + str(stats.count) + ' times'
for (d, s) in stats.subdirs.items():
print indent + d + ':'
printstats(s, indent + ' ')
>>> printstats(counts)
0 times
a:
0 times
c:
0 times
d:
1 times
b:
0 times
c:
2 times
d:
1 times
...