为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

繁花如伊 2022-08-16 18:51:29
我有文件列表example_list = [7.gif, 8.gif, 123.html]有超过700k个元素,我需要按频率对它们进行排序,以查看访问量最大的文件和访问量最少的文件。for i in resl:    if resl.count(i) > 500:        resl2.append(i)print(resl2)当我运行它时,它永远不会编译。我尝试了其他方法,但没有结果。
查看完整描述

4 回答

?
忽然笑

TA贡献1806条经验 获得超5个赞

您的算法不一定是二次时间。以下为线性


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]


查看完整回答
反对 回复 2022-08-16
?
三国纷争

TA贡献1804条经验 获得超7个赞

您的评论

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

所以:

statistics.mode(example_list)


查看完整回答
反对 回复 2022-08-16
?
www说

TA贡献1775条经验 获得超8个赞

请注意,它表示数组中的元素,而不是整数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)


查看完整回答
反对 回复 2022-08-16
?
白板的微信

TA贡献1883条经验 获得超3个赞

您可以使用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


之后,幽灵般的列表理解是诀窍!


[f for n,f in sorted(zip(files_freq, file_set), key=lambda x: x[0], reverse=True) if n >= 2]

这将创建一个仅包含出现2次或更多次的文件的列表,然后该部分强制函数使用第一个 from 进行排序,并按后代顺序对列表进行排序,显示之前的最高频率。keysortedfiles_freqzip(files_freq, file_set)reverse


查看完整回答
反对 回复 2022-08-16
  • 4 回答
  • 0 关注
  • 134 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信