【问题标题】:How do I order this list in Python?如何在 Python 中订购此列表?
【发布时间】:2009-11-23 10:24:34
【问题描述】:
[(u'we', 'PRP'), (u'saw', 'VBD'), (u'you', 'PRP'), (u'bruh', 'VBP'), (u'.', '.')]

我想按字母顺序排列,按“PRP、VBD、PRP 和 VBP” 这不是传统的那种,对吧?

【问题讨论】:

    标签: python list sorting


    【解决方案1】:

    使用 itemgetter:

    >>> a = [(u'we', 'PRP'), (u'saw', 'VBD'), (u'you', 'PRP'), (u'bruh', 'VBP'), (u'.', '.')]
    >>> import operator
    >>> a.sort(key = operator.itemgetter(1))
    >>> a
    [(u'.', '.'), (u'we', 'PRP'), (u'you', 'PRP'), (u'saw', 'VBD'), (u'bruh', 'VBP')]
    

    【讨论】:

    • 可接受的解决方案......但我认为它不值得导入。 :) 我更喜欢 Dave Webb 的方式。
    【解决方案2】:

    sort method 采用key 参数从每个参数中提取比较键,即key 是一个将列表项转换为您希望排序的值的函数。

    在这种情况下,use a lambda 很容易从每个元组中提取第二项:

    >>> mylist = [(u'we', 'PRP'), (u'saw', 'VBD'), (u'you', 'PRP'), (u'bruh', 'VBP')
    , (u'.', '.')]
    >>> mylist.sort(key = lambda x: x[1])
    >>> mylist
    [(u'.', '.'), (u'we', 'PRP'), (u'you', 'PRP'), (u'saw', 'VBD'), (u'bruh', 'VBP')]
    

    【讨论】:

    • 其实它和 itemgetter 是一样的,但至少你能看到它在做什么。
    【解决方案3】:

    您可以在sort 方法中传递一个比较函数。

    例子:

    l = [(u'we', 'PRP'), (u'saw', 'VBD'), (u'you', 'PRP'), (u'bruh', 'VBP'), (u'.', '.')]
    l.sort(lambda x, y: cmp(x[1], y[1])) # compare tuple's 2nd elements
    

    输出:

    >>> l
    [(u'.', '.'),
     (u'we', 'PRP'),
     (u'you', 'PRP'),
     (u'saw', 'VBD'),
     (u'bruh', 'VBP')]
    >>> 
    

    【讨论】:

    • 使用带有排序的键比使用 cmp 更可取,因为键只被调用 N 次,而 cmp 将被调用 NlogN 次。在 python3 中你别无选择,对 cmp 的支持已被移除
    • @gnibbler,感谢您的提示。为什么密钥只会被调用 N 次?我不知道。
    • @Nick,因为key Python 将遍历列表一次以计算键,然后使用这些键进行排序。另一方面,使用cmp,它会在每次需要比较两个值时调用该函数。
    • hmm,所以它会在排序之前收集键。谢谢。但是这一步不会使用额外的内存吗?对于大型列表,它真的比使用cmp 快吗?我必须测试这两种方法;-)
    【解决方案4】:

    或者使用排序的内置函数(类似于 Nick_D 的回答):

    ls = [(u'we', 'PRP'), (u'saw', 'VBD'), (u'you', 'PRP'), (u'bruh', 'VBP'), (u'.', '.')]
    
    
    sorted(ls, cmp=lambda t1, t2: cmp(t1[1], t2[1]))
    

    【讨论】:

      猜你喜欢
      • 2022-12-31
      • 2010-10-26
      • 2021-11-02
      • 2021-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-11
      相关资源
      最近更新 更多