python - 提高Python中列表集迭代的效率

标签 python python-2.7

我有一个列表列表,其中元素 0 中包含项目,元素 1 中包含与其关联的值。每个项目可能出现多次。我想创建一个唯一项目列表,其中每个项目都有最大值。我的代码实现了这一点,但似乎效率很低。另外,这是一个简化的示例。 mylist 可能有 100,000 行。有什么提高效率的建议吗?

mylist = [['Item 1', 12],['Item 1', 10], ['Item 3', 12],['Item 4', 10], ['Item 3', 14]]

# get unique items
my_unique_items = list(set(x[0] for x in mylist))

# make it a list of list
my_unique_items = [[x] for x in my_unique_items]

# iterate over list items
for item in my_unique_items:

    # do list comp to get max value and append
    item.append(max([x[1] for x in mylist if x[0] == item[0]]))

print my_unique_items

最佳答案

仅循环 mylist 一次会更有效。如果您只关心每个项目键的最大值,只需保留项目及其最大值的映射,并在浏览列表时比较它们。

最坏情况的复杂度为 O(n),而您原来的最坏情况的复杂度为 O(n^2)。

item_maxes = {}
for item in mylist:
    max_value = item_maxes.setdefault(item[0], None)
    if max_value is None or item[1] > max_value:
        item_maxes[item[0]] = item[1]

编辑:我认为ShadowRanger's此方法的版本看起来更清晰:

max_vals = {}
for item, value in mylist:
    max_vals[item] = max(max_vals.get(item, value), value)

关于python - 提高Python中列表集迭代的效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35046117/

相关文章:

python - 将 csv 文件转换为机器学习输入的最简单方法是什么?

python - python中大数据集的文本分类

c - 如何将列表传递给 python 上的 ctypes 函数

python - Scrapy:导入错误:没有名为管道的模块

python - 第一行数据已成为 Pandas 表中的一列

python 使用装饰器向方法添加属性

Python,在 smtplib 参数中添加逗号会导致错误

python - 如何让 Python 知道用户连接的 Wifi?

python - 在两个字符串(它们是变量)之间提取的正则表达式

python - 使用selenium python问题选择元素