[英]Python counting number of items in list and storing in a dictionary
我有以下清單:
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.
如何計算具有特定擴展名的列表中的項目數?
>>> 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})
>>>
最簡單的方法可能是:
>>> d = {}
>>> for item in files_list:
... d[item[-3:]] = d.get(item[-3:], 0) + 1
...
>>> d
{'pdf': 4, 'mov': 2, 'jpg': 3}
最簡單的方法是遍歷列表並使用字典存儲計數。
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]
正如其他海報在其答案中所示。
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(使用import語句每個循環最好3:33.3 µs)
itertools-10000個循環,每個循環最好3個:41.1 µs(使用import語句每個循環最好3個:44 µs)
您可以使用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}
您可以使用收集模塊中的計數器功能
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})
使用計數器和映射而不是列表理解
Counter(map(lambda x : x.split('.')[-1], files_list))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.