我有文件列表
example_list = [7.gif, 8.gif, 123.html]
有超过70万个元素,我需要按频率对其进行排序,以查看访问量最大的文件和访问最少的文件。
for i in resl:
if resl.count(i) > 500:
resl2.append(i)
print(resl2)
当我运行它时,它永远不会编译。我尝试了其他方法,但没有结果。
您的算法不必要地是二次时间。以下为线性
from collections import Counter
resl2 = [k for k,v in Counter(resl).items() if v > 500]
如果需要对它们进行排序,请执行类似的操作
resl2 = [(k,v) for k,v in Counter(resl).items() if v > 500]
resl2.sort(key=lambda kv: kv[1])
resl2 = [k for k,v in resl2]
您可以使用set
;)
这里有一个文件列表的最小示例,并显示了它出现2次的时间:
files = ['10.gif', '8.gif', '0.gif', '0.doc', '0.gif', '0.gif', '0.tmp', '0.doc', '0.gif']
file_set = set(files)
files_freq = [0]*len(file_set)
for n,file in enumerate(file_set):
files_freq[n] = files.count(file)
sorted_list = [f for n,f in sorted(zip(files_freq, file_set), key=lambda x: x[0], reverse=True) if n >= 2]
print(sorted_list)
并且输出将是:['0.gif', '0.doc']
set
将仅根据每个文件的唯一出现过滤列表,并且循环将计算每个文件的计数。
之后,怪异的列表理解是trick!
[f for n,f in sorted(zip(files_freq, file_set), key=lambda x: x[0], reverse=True) if n >= 2]
这将仅使用出现两次或更多次的文件创建一个列表,然后key
部分强制sorted
函数使用files_freq
中的第一个zip(files_freq, file_set)
进行排序,并且reverse
为以降序排序列表,显示之前的最高频率。