代码之家  ›  专栏  ›  技术社区  ›  tipu

在python中排序

  •  2
  • tipu  · 技术社区  · 15 年前

    我有一个这样的哈希图:

    results[tweet_id] = {"score" : float(dot(query,doc) / (norm(query) * norm(doc))), "tweet" : tweet}
    

    我想做的是按内部“得分”键对结果进行排序。我不知道这有多可能,我看到了许多排序教程,但它们是用于简单(不是嵌套)数据结构的。

    4 回复  |  直到 15 年前
        1
  •  4
  •   YOU    15 年前
    >>> results=[{"s":1,"score":100},{"s":2,"score":101},{"s":3,"score":99},{"s":4,"score":1},{"s":5,"score":1000}]
    
    >>> from operator import itemgetter
    
    >>> sorted(results, key=itemgetter("score"))
    [{'s': 4, 'score': 1}, {'s': 3, 'score': 99}, {'s': 1, 'score': 100}, {'s': 2, 'score': 101}, {'s': 5, 'score': 1000}]
    
        2
  •  3
  •   Olivier Verdier    15 年前

    您可以使用如下自定义比较函数对其进行排序:

    results.sort(key=lambda x:x['score'])
    
        3
  •  2
  •   Michael Aaron Safyan    15 年前

    你可以使用 sorted 具有 operator.itemgetter 要使用“得分”值作为键:

    sorted_results = sorted(results,key=operator.itemgetter("score"))
    
        4
  •  1
  •   Tim Pietzcker    15 年前

    假设你的 results 是一个 dict (因为你称之为散列图,我猜 tweet_id 是字典键,而不是计数器),您需要先将其转换为列表才能对其进行排序。在Python 3中:

    results = {}
    results["1234"] = {"score": 123, "tweet": "Hello"}
    results["4321"] = {"score": 321, "tweet": "there"}
    results["abcd"] = {"score": 111, "tweet": "sailor!"}
    l=[]
    for key, value in results.items():    # use .iteritems() in Python 2.x
        l.append([key, value])
    
    for item in sorted(l, key=lambda x: x[1]["score"]):
        print(item)
    

    意志输出

    ['abcd', {'tweet': 'sailor!', 'score': 111}]
    ['1234', {'tweet': 'Hello', 'score': 123}]
    ['4321', {'tweet': 'there', 'score': 321}]