【问题标题】:How to sort a list of strings by frequency?如何按频率对字符串列表进行排序?
【发布时间】:2020-06-13 16:23:52
【问题描述】:

我有一个文件列表

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

有超过 70 万个元素,我需要按频率对它们进行排序,以查看访问次数最多的文件和访问次数最少的文件。

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

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

【问题讨论】:

  • 这是确定所有出现超过 500 次的文件。我只需要找出哪个文件出现次数最多。
  • 它编译,它只是很慢,因为你的算法需要二次时间

标签: python list file sorting append


【解决方案1】:

请注意,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)

【讨论】:

    【解决方案2】:

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

    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]
    

    【讨论】:

    • 那么此代码是否也按最高计数排序?或者只是以超过 500 次出现的任意顺序将它们添加到列表中?
    • 不,它不按计数排序,但您显然可以这样做
    【解决方案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 次或更多次的文件创建一个列表,然后 key 部分强制 sorted 函数使用来自 zip(files_freq, file_set) 的第一个 files_freq 进行排序和 reverse就是按照子孙顺序对列表进行排序,显示之前的最高频率。

    【讨论】:

    • 这是还是二次方时间
    【解决方案4】:

    来自your comment

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

    所以:

    statistics.mode(example_list)

    【讨论】:

      猜你喜欢
      • 2021-12-20
      • 2021-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-06
      • 2021-06-10
      • 2021-02-21
      • 2023-03-21
      相关资源
      最近更新 更多