【问题标题】:Python - Maximum number of times element appear in list [duplicate]Python - 元素出现在列表中的最大次数[重复]
【发布时间】:2018-01-19 13:43:08
【问题描述】:

给定以下列表my_list = [ ['red', 'yellow', 'green'], ['red', 'yellow', 'green'], ['red', 'green', 'red']],我想找到最多出现的元素。我已经实现了一个蛮力方法以及一个新列表和一个字典来保存每个元素的值,但效率并不令人满意。哪种方法是实现此搜索的最佳方式?我正在使用 Python 3。

【问题讨论】:

  • “蛮力”是什么意思?并不是有一种神奇的算法可以计算列表中的元素而无需对其进行迭代。
  • 我使用了 3 个 for 循环。在一个新的list 中复制所有不同的元素,然后使用一个for 循环来跟踪我的新列表中的每个项目,并为给定列表使用另外两个嵌套的for 循环。

标签: python python-3.x


【解决方案1】:
my_list = [ ['red', 'yellow', 'green'], ['red', 'yellow', 'green'], ['red', 'green', 'red']]

new_list = [k for v in my_list for k in v]

from collections import Counter

c = Counter(new_list)

print c.most_common(1)
>>> [('red', 4)]

【讨论】:

  • 为了记忆,使用生成器代替new_list:print(Counter(element for sublist in my_list for element in sublist).most_common(1))
【解决方案2】:

您可以展平嵌套列表并应用max 函数:

my_list = [ ['red', 'yellow', 'green'], ['red', 'yellow', 'green'], ['red', 'green', 'red']]
new_list = [i for x in my_list for i in x]
max_val = max(new_list, key=lambda x:new_list.count(x))

输出:

'red'

【讨论】:

  • new_list 只是浪费内存。您可以只在内存中保留一本字典,然后边走边数。
  • @DeepSpace 您的解决方案会更高效,但究竟如何节省空间?
  • 在这里浪费了lambda
  • @Ajax1234 new_list 浪费内存,因为它是my_list 的不必要的扁平化版本。它至少可以变成发电机。
  • from collections import Counter ; print(Counter(element for sublist in my_list for element in sublist).most_common(1)) ; # [('red', 4)]
【解决方案3】:

您可以使用itertools.chain.from_iterable 展平您的列表,然后使用collections.defaultdict 来存储计数,从那里获取最大密钥很容易:

from collections import defaultdict
from operator import itemgetter
from itertools import chain

my_list = [['red', 'yellow', 'green'], ['red', 'yellow', 'green'], ['red', 'green', 'red']]

d = defaultdict(int)
for word in chain.from_iterable(my_list):
    d[word] += 1

print(max(d.items(), key = itemgetter(1))[0])
# red

【讨论】:

    猜你喜欢
    • 2020-01-26
    • 1970-01-01
    • 1970-01-01
    • 2017-02-13
    • 1970-01-01
    • 2020-12-04
    • 1970-01-01
    • 2015-04-24
    • 2021-06-05
    相关资源
    最近更新 更多