如何按频率对字符串列表进行排序?

时间:2020-03-01 00:00:36

标签: python list file sorting append

我有文件列表

example_list = [7.gif, 8.gif, 123.html]

有超过700k的元素,我需要按频率对它们进行排序,以查看访问量最大的文件和访问最少的文件。

for i in resl:
    if resl.count(i) > 500:
        resl2.append(i)
print(resl2)

运行此命令时,它永远不会编译。我尝试了其他方法,但没有结果。

4 个答案:

答案 0 :(得分:3)

您的算法不必要地是二次时间。以下是线性的

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]

答案 1 :(得分:1)

来自your comment

我只需要找出哪个文件出现得最多。

所以:

statistics.mode(example_list)

答案 2 :(得分:0)

请注意,i表示数组中的元素,而不是整数

for i in resl:
    if resl.count(i) > 500:
        resl2.append(i)
print(resl2)

将其更改为此。

for i in range(0,len(resl)-1):
    if i > 500:
        resl2.append(resl[i])
print(resl2)

答案 3 :(得分:0)

您可以使用set;)

这里有一个文件列表的最小示例,并显示了何时出现两次:

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仅根据每个文件的唯一出现次数过滤列表,并且循环将计算每个文件的计数。

之后,令人毛骨悚然的列表理解是技巧

[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则以后代顺序对列表进行排序,显示之前的最高频率。