【问题标题】:How to compare values in tuples in a list如何比较列表中元组中的值
【发布时间】:2015-11-13 09:40:10
【问题描述】:

我只是想弄清楚如何从元组列表中的元组中获取特定值。

例如,假设我有一个元组列表:

list = [(12345, 6789, 23456), (156748, 347890, 1234556), (1009544, 13578690, 1223455), ....]

列表中有 128 个元组,每个元组都有三个任意大的值。

我需要做的是从每个元组中获取第三个值,因为我需要为每对元组使用这些值并找到它们的最大公约数。

例如我需要从 tuple 1 中取 23456,从 tuple 2 中取 1234556 并找到它们的 gcd,然后我需要对 tuple 2 和 3 做同样的事情,等等。

我可以做到这一点,但是我对如何从列表中获取每个元组的第三个值有点困惑。

我知道如果它只是一个列表,我可以简单地调用list[3*m],其中 m 的范围是 1 到 128。

并且得到三的倍数的所有位置的数字,我可以对元组做同样的事情。但我不知道如何为元组列表执行此操作。

对不起,如果这有点令人困惑。我尽量解释清楚。

我不是要代码或任何东西,只是解释我将如何在列表中所有元组的某个位置找到一个值。

【问题讨论】:

    标签: python list data-structures tuples


    【解决方案1】:

    您可以使用以下方法获取值对来计算您的 GCD 值:

    def calc_gcd(v1, v2):
        print v1, v2        # add your GCD code here
    
    list_of_tuples = [(12345, 6789, 23456), (156748, 347890, 1234556), (1009544, 13578690, 1223455), (12345, 6789, 23456)]
    
    for p1, p2 in zip(list_of_tuples[:-1], list_of_tuples[1:]):
        calc_gcd(p1[2], p2[2])
    

    这将显示以下输出:

    23456 1234556
    1234556 1223455
    1223455 23456
    

    然后可以编写calc_gcd 函数来显示您想要的结果。注意,不要使用 list 作为变量名,因为它会影响 Python 自己的列表函数。

    这是如何工作的?此处的zip 函数采用两个列表,并且对于循环的每次迭代,它从每个列表中返回一个项目。诀窍是给它你的元组列表两次,一次从头开始,第二次从第二个条目开始,这样你会得到连续的条目对返回。

    所以p1 是一个元组,p2 是一个元组,然后它将每个值的第三个值传递给 gcd 函数,注意 Python 从 0 开始编号,因此第三个条目的索引为 2。

    要创建配对列表,可以使用 Python list comprehension 来构建列表,如下所示:

    pairs = [(p1[2], p2[2]) for p1, p2 in zip(list_of_tuples[:-1], list_of_tuples[1:])]
    
    for v1, v2 in pairs:
        calc_gcd(v1, v2)
    

    pairs 会持有:

    [(23456, 1234556), (1234556, 1223455), (1223455, 23456)]
    

    【讨论】:

    • 感谢代码和解释! :) 最后是否有一种方法可以存储这些值 p1、p2 而不是立即将它们放入我的 Gcd 函数中。然后使用存储的值来查找 gcd?
    • 当然,通过使用列表推导来构建它。我已经更新了答案。
    • 哦,好的,谢谢,所以现在我的对列表是另一个元组列表。我可以对其进行迭代以将每个对的元组放入我的 Gcd 函数中
    【解决方案2】:

    您可以通过以下列表理解来做到这一点:

    x = [(12345, 6789, 23456), (156748, 347890, 1234556), (1009544, 13578690, 1223455)]
    
    [t[2] for t in x]
    
    [23456, 1234556, 1223455]
    

    【讨论】:

    • 嗨,那会创建一个新列表,其中所有值都位于每个元组的第二个位置吗?那么我可以为 x 中的 t 做 my_list = t[2]
    • 是的,如果你的意思是 second==third :)(索引从 0 开始)
    • 嗨,我用我的列表尝试了这个,然后当我打印创建的下一个列表时,该列表打印 3 或 4 次,因此它将值多次添加到列表中,例如假设我打印 my_list 这是您在上面创建的列表,那么输出将是 [23456, 1234556, 1223455], [23456, 1234556, 1223455]
    • 我不确定是什么导致了您的问题。在示例中,我尝试使用您提供的三元组列表,它的工作原理如图所示。我应该看看你的代码,看看它做了什么。
    【解决方案3】:

    您可以像使用列表一样将索引传递给元组:

    >>> list[0][2]
    23456
    >>> list[1][2]
    1234556
    

    例如查看tutorial about tuples

    然后您可以例如循环列表并将一个元组的第 3 项与第二个元组的第 3 项进行比较:

    for i in range(0,len(list),2):
       yourFunction(list[i][2], list[i+1][2])
    

    【讨论】:

    • 好的,谢谢,但是对于 128 个元组的列表来说,这可能相当长:/
    【解决方案4】:

    你已经得到了很好的答案。 如果您想计算相邻元组中第三个值的 GCD,您可以这样做:

    import fractions
    t = [(1,2,3),(4,5,6),(7,8,9),(10,11,12)]
    agg = [iter(t)]*2
    gcds = [fractions.gcd(a[2],b[2]) for a,b in zip(*agg)]
    print(gcds)
    

    产生一个包含

    的列表
    [3, 3]
    

    可以读作

    [GCD(3, 6), GCD(9, 12), ....]
    

    【讨论】:

    • 嗨,所以这产生的输出 [3, 3] 会是第一个和第二个元组以及第二个和第三个元组的 Gcd 吗?也很抱歉,因为我是 python 新手,我不太明白最后一行在做什么,我可以麻烦你解释一下吗?这段代码是否还创建了每个元组的第三个值的列表?感谢您的帮助
    • 请看我的编辑。最终产品是一个列表,仅包含相邻元组的第三个元素的 GCD,对于提供的所有元组(在我的示例中为两对元组)
    【解决方案5】:

    就像在 Python 中遇到问题时一样,您可以使用 itertools 中的方法。在这种情况下组合:

    from itertools import combinations
    
    def do_something(list_of_tuples):
        for two_tuples in combinations(list_of_tuples, 2):
            """Do whatever you want to do with your values"""
            gcd = your_method_to_calculate_gcd(two_tuples[0][3], two_tuples[1][3])
    

    from itertools import combinations
    
    def do_something(list_of_tuples):
        for t1. t2 in combinations(list_of_tuples, 2):
            """Do whatever you want to do with your values"""
            gcd = your_method_to_calculate_gcd(t1[3], t2[3])
    


    combinations(list_of_tuples, 2) 将为您提供每对具有 (a,b) == (b,a) 的唯一元组 - 如果需要,请使用排列 (a, b) != (b,a) - 您可以简单地像你一样计算第三个元素的 gcd - 因为你有 - 只是两个元组的列表。

    不用担心性能,所有的 itertools 方法都具有很高的性能。

    【讨论】:

      【解决方案6】:

      试试这个

      ls = [(1, 2, 3), (4, 5, 6)]
      lsAns = [i[2] for i in ls]
      print max(lsAns)
      

      【讨论】:

      • 抱歉,我只是想知道最后一行是否会打印 lsAns 中的最高值?同样,此方法现在创建了一个仅包含我想要的值的新列表。那么我是否可以像使用普通列表一样使用此列表来比较列表中的值?
      • 是的,您可以将 lsAns 用作任何其他普通 python 列表。
      猜你喜欢
      • 2021-07-15
      • 1970-01-01
      • 2016-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多