2

我有一个像

listOfLists = [['key2', 1], ['key1', 2], ['key2', 2], ['key1', 1]]

内部列表的第一项是键。内部列表的第二项是值。

我想得到一个输出[['key1', 1], ['key2', 1]],它的值是具有相同键的列表中最小的列表,并且按键输出组(我的英语很差,所以只使用 Sql 语法的概念)

我写了一些这样的代码:

listOfLists = [['key2', 1], ['key1', 2], ['key2', 2], ['key1', 1]]
listOfLists.sort()    #this will sort by key, and then ascending by value
output = []
for index, l in enumerate(listOfLists):
    if index == 0:
        output.append(l)
    if l[0] == listOfLists[index - 1][0]:
        #has the same key, and the value is larger, discard
        continue
    else:
        output.append(l)

这似乎不够聪明有没有更简单的方法来完成这项工作?

4

3 回答 3

5

使用字典怎么样(不需要对数据进行排序)?

>>> listOfLists = [['key2', 1], ['key1', 2], ['key2', 2], ['key1', 1]]
>>> d = {}
>>> for k,v in listOfLists:
    d.setdefault(k, []).append(v)

>>> d = {k:min(v) for k,v in d.items()}
>>> d
{'key2': 1, 'key1': 1}

如果需要,您可以转换为列表

于 2012-09-19T01:44:09.050 回答
3

O(N log N) 解

您可以为此使用 dict 构造函数。由于排序步骤,它是 O(N log N)

>>> dict(sorted(listOfLists, reverse=True))
{'key2': 1, 'key1': 1}

要了解为什么会这样,请查看 sorted 的结果

>>> sorted(listOfLists, reverse=True)
[['key2', 2], ['key2', 1], ['key1', 2], ['key1', 1]]

构造函数将在dict遍历列表时替换每个键,并将每个键sorted的最小值推到该键的子列表末尾

O(N) 解决方案

>>> d = {}
>>> for k, v in listOfLists:
...  d[k] = min(d.get(k, v), v)
... 
>>> d
{'key2': 1, 'key1': 1}
于 2012-09-19T02:41:10.957 回答
2

itertools模块有一个非常有用的功能groupby,它可能正是您所需要的:

from itertools import groupby

listOfLists.sort()

for key, subgroup in groupby(listOfLists, lambda item: item[0]):
    print key, min(subgroup)
于 2012-09-19T01:43:57.617 回答