如何比较列表中元组中的值

时间:2015-11-13 09:40:10

标签: python list data-structures tuples

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

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

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

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

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

例如,我需要从元组1获取23456,从元组2获取1234556并找到他们的gcd,然后我需要为元组2和3等做同样的事情。

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

我知道这只是一个列表,我只需要调用list[3*m],其中m的范围是1到128.

在三个三倍的所有位置得到数字,我可以为元组做同样的事情。但是我不知道如何为元组列表做这个。

对不起,如果这有点令人困惑。我尽力解释它。

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

6 个答案:

答案 0 :(得分:1)

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

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

例如,请参阅tutorial about tuples

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

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

答案 1 :(得分:1)

您可以通过列表理解来完成此操作,如:

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

[t[2] for t in x]

[23456, 1234556, 1223455]

答案 2 :(得分: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)]

答案 3 :(得分:1)

你已经得到了很好的答案。 如果你想计算相邻元组中第三个值的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), ....]

答案 4 :(得分:0)

就像根据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方法都具有很高的性能。

答案 5 :(得分:-1)

试试这个

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