我有以下列表:
files_list = ['pic1.jpg', 'pic2.jpg', 'pic3.jpg', 'movie1.mov', 'movie2.mov', 'doc1.pdf', 'doc2.pdf', 'doc3.pdf', 'doc4.pdf']
我想计算具有特定文件扩展名的项目数,并将其存储在字典中。
预期输出为:
extn_dict = {'jpg': 3, 'mov': 2, 'pdf': 4}
我正在编写以下代码:
for item in files_list:
extn_dict[item[-3:]] = count(item) # I understand I should not have count() here but I'm not sure how to count them.
如何使用特定扩展名计算列表中的项目数?
答案 0 :(得分:12)
>>> from collections import Counter
>>> files_list
['pic1.jpg', 'pic2.jpg', 'pic3.jpg', 'movie1.mov', 'movie2.mov', 'doc1.pdf', 'doc2.pdf', 'doc3.pdf', 'doc4.pdf']
>>> c = Counter(x.split(".")[-1] for x in files_list)
>>> c
Counter({'pdf': 4, 'jpg': 3, 'mov': 2})
>>>
答案 1 :(得分:2)
最简单的方法可能是:
>>> d = {}
>>> for item in files_list:
... d[item[-3:]] = d.get(item[-3:], 0) + 1
...
>>> d
{'pdf': 4, 'mov': 2, 'jpg': 3}
答案 2 :(得分:1)
最简单的方法是遍历列表并使用字典存储您的计数。
files_list = ['pic1.jpg', 'pic2.jpg', 'pic3.jpg', 'movie1.mov',
'movie2.mov', 'doc1.pdf', 'doc2.pdf', 'doc3.pdf', 'doc4.pdf']
counts = {}
for f in f:
ext = f[-3:]
if ext not in counts:
counts[ext] = 0
counts[ext] += 1
print counts
#{'pdf': 4, 'mov': 2, 'jpg': 3}
毫无疑问,还有其他奇特的解决方案,但我认为这更容易理解。
如果你不能认为扩展名总是3个字符,那么你可以将ext =
行更改为:
ext = f.split(".")[-1]
正如其他海报在答案中所表明的那样。
答案 3 :(得分:1)
files_list = ['pic1.jpg', 'pic2.jpg', 'pic3.jpg', 'movie1.mov', 'movie2.mov', 'doc1.pdf', 'doc2.pdf', 'doc3.pdf', 'doc4.pdf']
extension_set = [i.split('.')[-1] for i in files_list]
d = {j:extension_set.count(j) for j in extension_set}
print(d)
分析:
当前方法 - 10000次循环,最佳3:每循环25.3μs
计数器 - 10000次循环,最佳为每循环3:30.5μs(最佳3:33.3μs/循环使用import语句)
itertools - 10000次循环,最佳3:每循环41.1μs(最佳3:44μs每循环使用import语句)
答案 4 :(得分:0)
您可以使用itertools.groupby
:
import itertools
files_list = ['pic1.jpg', 'pic2.jpg', 'pic3.jpg', 'movie1.mov', 'movie2.mov', 'doc1.pdf', 'doc2.pdf', 'doc3.pdf', 'doc4.pdf']
final_counts = {a:len(list(b)) for a, b in itertools.groupby(sorted(files_list, key=lambda x:x.split('.')[-1]), key=lambda x:x.split('.')[-1])}
输出:
{'pdf': 4, 'mov': 2, 'jpg': 3}
答案 5 :(得分:0)
您可以使用收集模块中的计数器功能
from collections import Counter
files_list = ['pic1.jpg', 'pic2.jpg', 'pic3.jpg', 'movie1.mov', 'movie2.mov', 'doc1.pdf', 'doc2.pdf', 'doc3.pdf', 'doc4.pdf']
temp = []
for item in files_list:
temp.append(item[-3:])
print Counter(temp)
>>> Counter({'pdf': 4, 'jpg': 3, 'mov': 2})
答案 6 :(得分:0)
使用计数器和地图代替列表理解
Counter(map(lambda x : x.split('.')[-1], files_list))