【问题标题】:Python list of frequent occurrences in a list of strings字符串列表中频繁出现的 Python 列表
【发布时间】:2015-09-30 21:14:04
【问题描述】:

我正在编写一个 python 函数,它使用一个字符串列表并生成一个最常出现的项目的列表。

例如:

>>> trending(["banana", "trouble", "StarWars", "StarWars", "banana", "chicken", "BANANA"])
["banana", "StarWars"]

但是

>>> trending(["banana", "trouble", "StarWars", "Starwars", "banana", "chicken"])
["banana"]

到目前为止,我已经编写了一个函数,它只生成第一个频繁出现的单词,而不是一个频繁出现的单词列表。此外,我的列表中还包含该频繁项的索引。

def trending(slst):
    words = {}
    for word in slst:
        if word not in words:
            words[word] = 0
        words[word] += 1
    return words

如何修复此函数以生成最常出现的项目列表(而不是最常出现的项目中的第一个)以及如何删除索引?

【问题讨论】:

  • “我正在编写一个...生成列表的 python 函数” - 不,你不是。完全不清楚该函数应该做什么,或者这与它实际在做什么有什么不同。
  • 您希望退回多少件商品?只有前两个最频繁?
  • @jonrsharpe 我正在努力......
  • @MalikBrahimi 是最常出现的项目,但如果两个不同的项目出现相同的情况,并且它在列表中的其余项目中是最大的,那么这两个项目的列表按它们的第一个的顺序排列出现在列表中。同样的,有 3 或 4 个等不同的项目出现相同的情况,并且出现频率最高
  • @ShagunChhikara 试试下面的代码。

标签: python list loops for-loop for-in-loop


【解决方案1】:

使用Counter

In [1]: from collections import Counter

In [2]: l = ["banana", "trouble", "StarWars", "StarWars", "banana", "chicken", "BANANA"]

In [3]: Counter(l)
Out[3]: Counter({'StarWars': 2, 'banana': 2, 'BANANA': 1, 'trouble': 1, 'chicken': 1})

使用Counter(l).most_common(n),您可以获得n 最常见的物品。


更新

您的trending() 功能基本上也是Counter 的功能。统计单词出现次数后,您可以使用max(words.values()) 获得最大出现次数。这可用于过滤您的单词列表:

def trending(slst):
    ...
    max_occ = max(words.values())
    return [word for word, occ in words.items() if occ == max_occ]

【讨论】:

  • 我无法导入模块,这是作业要求的一部分
  • 这不是 OP 想要的。 most_common(1) 即使有平局也只返回一个元素。
【解决方案2】:

不使用Counter,您可以使用dict 制作自己的计数器并提取频繁项:

def trending(slst):
    count = {}
    items = []

    for item in set(slst):
        count[item] = slst.count(item)

    for k, v in count.items():
        if v == max(count.values()):
            items.append(k)

    return items

【讨论】:

  • 有没有办法在没有字典或导入模块的情况下做到这一点?我还需要合并循环
  • @ShagunChhikara 这些确实有 for 循环,但 here 是等效的重写。
  • 该代码主要工作。生产的物品顺序不正确。我应该扭转结果吗?
  • 将最后一行改为:return sorted(items, key = lambda x: slst.index(x))
  • 如果我想将代码更改为不使用集合怎么办?套装还不是我们涵盖的材料,我刚刚咨询了我的教授,发现我们不允许使用它,抱歉
【解决方案3】:

以下解决方案仅使用列表。没有使用dictionaryset 或其他 Python 集合:

def trending(words):
    lcounts = [(words.count(word), word) for word in words]
    lcounts.sort(reverse=True)
    ltrending = []

    for count, word in lcounts:
        if count == lcounts[0][0]:
            if word not in ltrending:
                ltrending.append(word)
        else:
            break

    return ltrending


ltests = [
    ["banana", "trouble", "StarWars", "StarWars", "banana", "chicken", "BANANA"],
    ["banana", "trouble", "StarWars", "Starwars", "banana", "chicken"]]

for test in ltests:
    print trending(test)

它给出以下输出:

['banana', 'StarWars']
['banana']

【讨论】:

    猜你喜欢
    • 2015-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-28
    • 1970-01-01
    • 2020-01-27
    相关资源
    最近更新 更多