【问题标题】:sorting one list based on the results of python in descending order根据python的结果降序排序一个列表
【发布时间】:2016-04-14 12:22:14
【问题描述】:

输入

a= (92, 93, 94, 95)
b= [0.76, 0.46, 0.56,0.64]

要求是列表a根据列表b降序排序

a= [92, 95, 94, 93]
b= [0.76, 0.64, 0.56, 0.46]

我用过

a,b = zip(*sorted(zip(a,b), key=operator.itemgetter(0), reverse=True))

我尝试使用它按升序排序,然后尝试使用另一个列表以相反的顺序写入。

错误是:

key=operator.itemgetter(0), reverse=True))
NameError: name 'operator' is not defined

有什么建议吗?

【问题讨论】:

    标签: python list sorting


    【解决方案1】:

    您看到的错误是因为您需要导入operator 模块。即使这样做也不能解决问题。

    相反,您可以这样做:

    b, a = zip(*sorted(zip(b,a), reverse=True))
    

    对于您的数据:

    >>> a = [92, 93, 94, 95]
    >>> b = [0.76, 0.46, 0.56,0.64]
    >>> b, a = zip(*sorted(zip(b,a), reverse=True))
    >>> a
    (92, 95, 94, 93)
    >>> b
    (0.76, 0.64, 0.56, 0.46)
    

    这会给你元组。如果你真的想要/需要列表:

    >>> a = [92, 93, 94, 95]
    >>> b = [0.76, 0.46, 0.56,0.64]
    >>> b, a = (list(x) for x in zip(*sorted(zip(b,a), reverse=True)))
    >>> a
    [92, 95, 94, 93]
    >>> b
    [0.76, 0.64, 0.56, 0.46]
    

    【讨论】:

    • @mhwake ValueError: 需要超过 0 个值才能解压
    • @HamadHassan:真的吗?它适用于我在 Python 2 和 3 中。你使用的是什么版本的 Python?您测试的是哪个示例?
    • 这可能是我的错误,我在屏幕上看到的是 (92, 93, 94, 95) [0.76, 0.46, 0.56, 0.64] 第一个不是列表?我什至尝试打印 a[0] 但索引超出范围!
    • 我使用的是 python 2.7
    • @HamadHassan:绝对是你的错误。它在 2.7 中对我有用。答案很清楚,有 2 个变体:第一个返回 tuplesboth ab)。第二个返回lists(同样both ab)。看不到您是如何获得每种类型的。
    【解决方案2】:

    import operator了吗?

    不需要:

    z = list(zip(a, b))
    z = sorted(z, key=lambda i: i[1], reverse=True)
    a, b = list(zip(*z))
    

    【讨论】:

    • TypeError: () 只需要 1 个参数(给定 2 个)
    • 如果您zip() 以其他顺序列出您根本不需要lambda。它也不起作用(您需要将 key 函数作为关键字参数传递)。
    猜你喜欢
    • 2020-10-13
    • 2011-05-10
    • 1970-01-01
    • 2022-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多