Как я могу решить эту проблему с помощью циклов, без регулярных выражений?
Напишите функцию, которая принимает список имен файлов и возвращает словарь с расширениями в качестве ключей и их вхождениями в качестве значения.
Пример:
#print(count_file_types(["image1.jpg", "image2.jpg", "preso.pptx"]))
#=> {"jpg": 2, "pptx": 1}
Я попробовал это, но думаю, что это все неправильно:
def count_file_types(string_arr):
arr = []
for i in string_arr:
arr.append(i.split("."))
return(arr)
print(arr)
freq = {}
for i in arr:
if i in freq:
freq[i] += 1
else:
freq[item] = 1
return freq
print(freq)
print(count_file_types(['image1.jpg', 'image2.jpg', 'preso.pptx']))






Для этого вы можете использовать pathlib.Path и collections.Counter.
from pathlib import Path
from collections import Counter
def count_ext(file_list: list[str]):
return dict(Counter(Path(f).suffix.lstrip('.') for f in file_list))
Вы можете (не должны) сделать это без каких-либо импортированных модулей следующим образом:
def count_file_types(filenames: list[str]) -> dict[str, int]:
result = {}
for filename in filenames:
suffix = filename.split(".")[-1]
result[suffix] = result.get(suffix, 0) + 1
return result
print(count_file_types(["image1.jpg", "image2.jpg", "preso.pptx"]))
Выход:
{'jpg': 2, 'pptx': 1}
Примечание:
Для образцов данных, приведенных в вопросе, это значительно быстрее, чем (возможно) более питонический подход, предложенный @James.
Спасибо! Я не могу полностью уяснить эту часть кода: result[suffix] = result.get(suffix, 0) + 1, не могли бы вы объяснить это по пунктам, пожалуйста?
@Evanto См. эту документацию
возможно, другой, более компактный подход
def count_file_ext(file_list):
ext_list = [ext.split('.')[-1] for ext in file_list]
return {ext:ext_list.count(ext) for ext in set(ext_list)}
Работает для данных, показанных в вопросе, но не даст правильных результатов, если список содержит следующее (действительное) имя файла: abc.xyz.txt
внес правки, спасибо за замечание
Отредактировал мое первоначальное решение, по-видимому, это работает:
def count_file_types(string_arr):
arr = []
for i in string_arr:
arr.append(i.split("."))
print(arr)
freq = {}
for (name, ext) in arr:
if ext in freq:
freq[ext] += 1
else:
freq[ext] = 1
return freq
print(freq)
Это будет работать для значений, показанных в исходном вопросе, но не является универсальным решением. Учтите, что a.b.txt — допустимое имя файла.
Как все это неправильно?