Python 字符串列表中频繁出现的列表
Python list of frequent occurrences in a list of strings
我正在编写一个 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
如何修复此函数以生成最常出现的项目列表(而不是最常出现的项目中的第一个)以及如何删除索引?
使用 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]
在不使用 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
以下解决方案仅使用列表。未使用 dictionary
、set
或其他 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']
我正在编写一个 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
如何修复此函数以生成最常出现的项目列表(而不是最常出现的项目中的第一个)以及如何删除索引?
使用 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]
在不使用 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
以下解决方案仅使用列表。未使用 dictionary
、set
或其他 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']