分享
三行代码  ›  专栏  ›  技术社区  ›  Minuet

类型错误:“generator”和“generator”的实例之间不支持“<”

  •  -1
  • Minuet  · 技术社区  · 5 天前

    当我运行这段代码时 list 属于 (str,int) tuples :

    list.sort(key = lambda x: (abs(s - x[1]), x[1], len(x[0]), (255 - ord(i) for i in x[0])))

    它返回以下错误: TypeError: '<' not supported between instances of 'generator' and 'generator'

    我发现是因为 (255 - ord(i) for i in x[0]) 将字符串按相反的词典顺序排序。

    有人能告诉我为什么我会犯这个错误吗?

    3 回复  |  直到 5 天前
        1
  •  1
  •   komatiraju032    5 天前

    试试这个:

    fun = lambda x: (abs(s - x[1]), x[1], len(x[0]), [255 - ord(char) for char in x[0]]) 
    y = sorted(lst, key = fun)
    
        2
  •  0
  •   danieli    5 天前

    必须传递一个函数来比较列表中的单个元素,在本例中是 (str, int) 我不确定我是否理解您试图通过该代码实现的目标,也许您可以尝试以下操作:

    l = [(0, 'a'), (1, 'b'), (2, 'v')]
    l.sort(key=lambda x: 255 - ord(x[1]))
    # l now is [(2, 'v'), (1, 'b'), (0, 'a')]
    

    但是你可以让Python为你做:

    l.sort(key=lambda x: x[1], reverse=True)
    
        3
  •  0
  •   Yang HG    5 天前

    如果你试着 print(type((i for i in range(10)))) tuple(i for i in range(10)) [i for i in range(10)]

    编辑:

    sort(key=lambda x: (abs(s - x[1]), x[1], len(x[0]), tuple(255 - ord(i) for i in x[0])))
    

    这意味着,首先构造一个包含3个项的元组,然后在计算之后添加字符串。

        4
  •  0
  •   Dunes    5 天前

    使用 ord 不按字典顺序排序。在某些情况下,它与某些语言的词典顺序非常相似,但有许多独特之处。一开始,用英语来说 B 之前 a . 如果你想要真正的词典排序,你需要使用 locale.strxfrm 在您的密钥中,正确设置您的区域设置。 locale.setlocale(locale.LC_COLLATE, '')

    >>> sorted('aAbB')
    ['A', 'B', 'a', 'b']
    >>> import locale
    >>> import locale.setlocale(locale.LC_COLLATE, 'English_United Kingdom')
    >>> sorted('aAbB', key=locale.strxfrm)
    ['a', 'A', 'b', 'B']
    

    字符串的标准排序使用 作战需求文件 不过,在幕后,如果您只是想颠倒排序,那么最简单的方法是否定键的数字部分并设置 reverse=True . 如果希望使用真正的反向词典排序和您的键,这也可以工作。如。

    s = 0
    my_list = [('NICOLE', 30), ('LAUREN', 30), ('MILA', 30)]
    
    def my_key(item):
        return -abs(s - item[1]), -item[1], -len(item[0]), item[0]
    
    my_list.sort(key=my_key, reverse=True)
    print(my_list)
    

    给予

    [('MILA', 30), ('NICOLE', 30), ('LAUREN', 30)]