python-3.x 遍历元组列表以比较和报告最小值、最大值

mzmfm0qo  于 2022-11-26  发布在  Python
关注(0)|答案(2)|浏览(165)

我之前的问题没有被理解,所以我重新措辞并发布这个问题。我有一个(class, n_class_examples)的元组列表,如下所示:

my_list = (0, 126), (1, 192), (2, 330), (3, 952) ]

因此,我对生成一个函数很感兴趣,它接收这样一个列表,将每个元组与所有其他元组进行比较,并在每种情况下报告哪个类的样本数较少(min_class),哪个类的样本数较多(max_class)。

def get_min_max_class(current_list):
    for tn, tn+1: # tn -> 1-tuple, tn+1 any other tuple not tn
        if tn[1] < tn+1[1]
            smaller_class = tn[0]
            larger_class = tn+1[0]
        smaller_class = tn+1[0]
        larger_class = tn[0]
    return # smaller, larger of the 2 compared in each case

这样一来:

get_min_max_class(my_list)
# would perform the comparison like so:
(0, 126) v (1, 192) -> min_class = 0, max_class = 1 # in this case
(0, 126) v (2, 330) -> min_class = 0, max_class = 2 # and in this case
(0, 126) v (3, 952) -> min_class = 0, max_class = 3 # and here ..
(1, 192) v (2, 330) -> min_class = 1, max_class = 2 # ...
(1, 192) v (3, 952) -> min_class = 1, max_class = 3
(2, 330) v (3, 952) -> min_class = 2, max_class = 3

请原谅我对函数的定义,但我希望函数能迭代地比较这些项目,每次都报告哪个更大,哪个更小。

2skhul33

2skhul331#

迭代itertools.combintions生成的对列表,分别使用minmax处理每个对。

from itertools import combinations
from operator import itemgetter

first = itemgetter(0)
second = itemgetter(1)

def get_min_max_class(current_list):
    for pair in combinations(current_list, 2):
        p0, p1 = pair
        min_class = first(min(pair, key=second))
        max_class = first(max(pair, key=second))
        print(f'{p0} v {p1} -> min_class = {min_class}, max_class = {max_class}')

get_min_max_class(my_list)

如果要返回结果列表,而不是简单地打印报告,则必须定义要返回的确切内容。

iezvtpos

iezvtpos2#

Python的sorted()、min()和max()函数的第二个参数是一个"key",它让我们可以使用lambda函数来指定如何计算不同对象的排序。在本例中,我们希望根据第二个元素的值对元组进行排序,并返回相应的第一个值。
所以,如果我想在你的情况下"最大"我会做:

max_class = max(my_list, key=lambda x: x[1])[-1]

lambda表达式,如果你还不知道的话,就是说"根据你在x [1]找到的任何东西对列表中的项x排序"。然后,取排序列表的最后一个元素,得到样本最多的类,或者确切地说,不管它是什么。
我希望这对你有帮助!

相关问题