Python计算列表中的项目数并存储在字典中

时间:2018-02-15 18:47:23

标签: python

我有以下列表:

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.

如何使用特定扩展名计算列表中的项目数?

7 个答案:

答案 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))