【问题标题】:Sorting tuples in a list based on their product in Python根据 Python 中的产品对列表中的元组进行排序
【发布时间】:2021-12-17 01:18:30
【问题描述】:

我正在尝试编写一个过程来根据每个元组的产品值对列表中的元组进行排序。我只是尝试先使用 while 循环对它们进行排序,但我无法整合元组内数字的乘法。我到目前为止的代码是:

def sort_list (a):
    i = 0
    while i < len(a):
        key = i
        j = i + 1
        
        #first checking throuh the whole list if any number is bigger
        
        while j < len(a):
            if a[key] > a [j]:
                key = j
            j += 1
            
        #swap the numbers if the key one (i) is bigger than the j one the j one will be the new key
        # and swapped in the next section!
        
        a[i], a[key] = a[key], a[i]
        i += 1
    return a        

m = [(2, 3.0), (3, 1.0), (4, 2.5), (1, 1.0)]

sort_list(m)

print (m)

# should output : [(1, 1.0), (3, 1.0), (2, 3.0), (4, 2.5)]

【问题讨论】:

  • 为什么不使用list.sort 方法?
  • 例如m.sort(key=lambda x: x[0] * x[1])
  • 在python中>=3.8 import math; m.sort(key=math.prod)
  • @Ch3steR 在仔细阅读您的答案后,我删除了我的评论。你写了list.sort(m, key=...) 而不是m.sort(key=...),这有点不寻常但没有错。我发表了我的评论,因为当阅读不够仔细时,我虽然您已将列表称为 list 并使用 list.sort(key=...) 对其进行排序。但这不是你在做的。所以我删除了我的评论。

标签: python sorting tuples product


【解决方案1】:

list 类有一个方法 .sort,它可以就地排序,并有一个 key 参数来指定自定义比较。

  • list.sort:

    key 指定一个参数的函数,用于从每个列表元素中提取比较键(例如,key=str.lower)。列表中每一项对应的key计算一次,然后用于整个排序过程。默认值None表示列表项直接排序,不计算单独的key值。

Python &gt;= 3.8

在您的情况下,我们需要计算元组中所有元素的乘积。我们可以使用math.prod1,类似于sum

from math import prod

m = [(2, 3.0), (3, 1.0), (4, 2.5), (1, 1.0)]
m.sort(key=prod)
# list -> [(1, 1.0), (3, 1.0), (2, 3.0), (4, 2.5)]

Online Demo

我使用math.prod 来概括解决方案,让您可以灵活地在任意长度可迭代的情况下使用解决方案。

Python &lt; 3.8

我们可以使用functools.reduceoperator.mul 进行泛化,使其适用于任意长度的可迭代。以下代码也适用于 Python2.7。

from functools import reduce, partial
from operator import mul

prod = partial(reduce, mul)
m.sort(key=prod)

Online Demo


1。 math.prod is available from python3.8

【讨论】:

  • 整洁!我希望 stdlib 中的 mult 有一些东西,看起来 math.prod 适合这里的账单。
  • @rv.kvetch 他们最近添加了它。它可以从 python3.8 获得这可能是它还没有被广泛使用的原因:)
  • @Ch3steR 已经两年多了。
  • @KellyBundy 是的。在我的辩护中,海象操作员偷走了所有的注意力。 :P 和 math.prod 位于最新页面的中间(也只有一行)。再说一次,我可能错了,它没有广为人知。我只是根据我有限的知识发表评论。
  • @Ch3steR 好吧,我怀疑它并不广为人知,是的:-)。我想我误解了你之前的评论,听起来人们不使用math.prod,因为他们还没有使用 3.8(我希望我们大多数人现在都使用 3.8+...)
【解决方案2】:

list.sort()sorted()key argument 一起使用

从 Python 3.8 开始,有一个函数 math.prod 可以计算元组中项目的乘积。您可以像这样将其用作关键参数:

import math.prod
m = [(2, 3.0), (3, 1.0), (4, 2.5), (1, 1.0)]
list.sort(m, key=math.prod)
print(m)

在 Python 3.8 之前,您可以使用 lambda(或任何其他函数)完成此操作:

m = [(2, 3.0), (3, 1.0), (4, 2.5), (1, 1.0)]
list.sort(m, key=lambda x: x[0] * x[1])
print(m)

list.sort()sorted() 之间的区别在于 list.sort() 正在原地更改 m,因此您不必再次将其分配给 m。另一方面,如果您使用sorted(),则排序列表将作为新列表返回,因此您必须将其分配给 t m。

【讨论】:

    【解决方案3】:

    list.sortsorted 都允许你指定一个 key 参数,它应该是一个函数,给出一个用于排序的“分数”。在您的情况下,我们只需将此分数作为元组元素的乘积:

    sorted(m, key=lambda x: x[0]*x[1])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-20
      • 2016-10-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多