逐列提取python中元组列表的列表

时间:2017-09-25 14:56:15

标签: python list

我在这里列出了元组列表

A =[[(1, 52), (1, 12), (-1, -1)],[(-1, 23), (1, 42), (-1, -1)],[(1, -1), (-1, -1), (1, 42)]]

我希望在元组的第二个元素中以列为单位获取包含最大值的元组。

我尝试访问这样的列

A[:,2]

但是我收到了错误

  

TypeError:列表索引必须是整数,而不是元组

提前致谢,如果您需要任何其他信息,请与我们联系

编辑1:

期望的输出:

[(1, 52),(1, 42),(1, 42)]

3 个答案:

答案 0 :(得分:2)

[max(a,key=lambda x:x[1]) for a in zip(*A)]

输出:

[(1, 52), (1, 42), (1, 42)]

请告诉我这是否适合你,我会解释答案。

你可以访问这样的列..

>>> list(zip(*A)[0])
[(1, 52), (-1, 23), (1, -1)]
>>> list(zip(*A)[1])
[(1, 12), (1, 42), (-1, -1)]

<强>解释
压缩 https://docs.python.org/3/library/functions.html#zip

>>> x=[1,2,3]
>>> y=['a','b','c']
>>> z=['first','second','third']
>>> zip(x,y,z)
[(1, 'a', 'first'), (2, 'b', 'second'), (3, 'c', 'third')]

现在假设x,y,z是A中的行。通过zip(行)它返回第一个元素,第二个元素,第三个元素等...通过返回我们传递的行的列。 注意:zip作用于传入的多个参数,因此我们需要分别发送多行,如x,y,z,而不是像[x,y,z]那样发送列表。这是通过* A来完成的,它将行和传递分隔为zip。

现在我们有了不同的专栏

<强>最大 https://docs.python.org/3/library/functions.html#max

max(1,2)                      #Will return 2
max(cars,lambda x:x.speed)    #Will give you the fastest car
max(cars,lambda x:x.capacity) #Will give you the biggest passenger car
max(tups,lambda x:x[1])       #Will give you the tuple with biggest 2nd element

列表理解 https://docs.python.org/3/tutorial/datastructures.html#list-comprehensions

A=[1,2,3]
[x**2 for x in A]     #Will give you [1,4,9]
[x**3 for x in A]     #Will give you [1,8,27]

最后

[max(a,key=lambda x:x[1]) for a in zip(*A)]

每列都会给你最大值!

答案 1 :(得分:1)

你可以试试这个:

A =[[(1, 52), (1, 12), (-1, -1)],[(-1, 23), (1, 42), (-1, -1)],[(1, -1), (-1, -1), (1, 42)]]

new_A = [max(a, key=lambda x: x[-1]) for a in zip(*A)] 

输出:

[(1, 52), (1, 42), (1, 42)]

答案 2 :(得分:1)

A列表是元组列表。基本Python不承认多元素下标,尽管Numpy和类似的模块扩展了它。因此,您的下标表达式:,2被解释为一个元组,其第一个元素是一个虱子,其第二个元素是一个整数,(如消息所解释的那样)不能作为列表索引。

不幸的是,&#34;元组在元组的第二个元素中包含最大值的元组,以列为单位&#34;并不是对实际预期结果的非常好的描述。

我认为你想要的答案是[(1, 52), (1, 42), (1, 42)]

实现此目的的一种相对简单的方法是分别对每个子列表进行排序,并采用每个子列表的最后一个元素。这可以拼写为

result = [sorted(x, key=lambda z: z[1])[-1] for x in A]

key函数的sorted参数确保每个列表在其第二个元素上排序, [-1]下标采用排序列表的最后一个(因此也是最高的)元素,for x in A确保输出的每个元素对应一个元素(,一个列表三个元组的输入。