我在这里列出了元组列表
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)]
答案 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
确保输出的每个元素对应一个元素(即,一个列表三个元组的输入。