【问题标题】:TypeError: bad operand type for unary -: 'str' for Lambda sorting dictionary funtion PythonTypeError:一元操作数类型错误-:Lambda排序字典函数Python的'str'
【发布时间】:2021-03-17 11:58:35
【问题描述】:

对于下面的程序,我被上面的错误语句卡住了。程序应按值(降序)对字典进行排序,如果值相同,则按字母顺序(升序)。

sorted(dict, key = lambda x: (-x[1], x[0]))

如果我做出改变:

sorted(dict.items(), key = lambda x: (-x[1], x[0]))

它确实有效,但它也会打印该值。我只想要一个键列表。

这可能吗?

【问题讨论】:

  • 如果您只想要密钥,请在排序后的字典上使用 .keys() 并仅获取密钥。
  • 如果您只想要键,为什么还要使用字典...?使用列表不是更容易吗?
  • 看起来sc2 中的键是字符串,所以x[1]str(单个字符),也是x[0]。告诉我们sc2。无论如何x[1]str
  • sc2 更改为sc2.items() 并不是一个“微小”的变化。

标签: python function sorting dictionary lambda


【解决方案1】:

您将不得不稍微修改您的方法。你在tuples 上从items 操作并返回tuples。您想对键进行操作并仅返回键。

>>> # let sc2 be:
>>> sc2 = {'aaa': 10, 'bcd': 5, 'abc': 10, 'cde': 1}
>>>
>>> # your approach:
>>> sorted(sc2.items(), key = lambda x: (-x[1], x[0]))
[('aaa', 10), ('abc', 10), ('bcd', 5), ('cde', 1)]
>>>
>>> # see this one:
>>> sorted(sc2, key = lambda x: (-sc2[x], x))
['aaa', 'abc', 'bcd', 'cde']  

【讨论】:

    【解决方案2】:

    如果您必须检查多个条件的比较,例如:如果第一个参数相同,则根据另一个参数进行比较,依此类推。 您可以在python中使用comparator来编写如下所示的排序逻辑:

    import functools
    
    sc2 = {'wsd': 10, 'bcd': 5, 'abc': 10, 'cde': 1}
    
    def my_cmp(a,b):
        if sc2[a] == sc2[b]:
            return -1 if a > b else 1
        elif sc2[a] > sc2[b]:
            return 1
        else:
            return -1
    
    s = sorted(sc2, key=functools.cmp_to_key(my_cmp), reverse=True)
    
    Output:-> ['abc', 'wsd', 'bcd', 'cde']
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-28
      • 1970-01-01
      • 2021-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-02
      相关资源
      最近更新 更多