2

私は次のようなリストを持っています

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

内部リストの最初の項目がキーです。内部リストの2番目の項目は値です。

[['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(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 に答える