元组数组中最大元素的索引

时间:2019-03-13 13:19:13

标签: python

如何在短代码行中找到列表中元组最大值的索引?

我可以使用两个for循环来做到这一点,但是我不能使其更短。

例如:

[(0, 0.51634575), (1, 0.113904804), (2, 0.7697494)]
[(0, 0.20560692), (1, 0.141724408), (2, -0.112972)]
[(0, 0.11324576), (1, 0.77262518), (2, 0.11417362)]

应该返回

2
0
1

是元组的第一个值(索引)。

这是我尝试过的:

a= [(0, 0.11324576), (1, 0.77262518), (2, 0.11417362)]

max = max([x[1] for x in a])
id=-1
for x in a:
    if x[1] == max:
        id = x[0]
        break

print(id)

6 个答案:

答案 0 :(得分:2)

您可以将运算符itemgetter()用作函数max()中的键:

from operator import itemgetter

l = [[(0, 0.51634575), (1, 0.113904804), (2, 0.7697494)], [(0, 0.20560692), (1, 0.141724408), (2, -0.112972)], [(0, 0.11324576), (1, 0.77262518), (2, 0.11417362)]]

get1 = itemgetter(1)
[max(i, key=get1)[0] for i in l]
# [2, 0, 1]

答案 1 :(得分:1)

虽然不漂亮,但这应该可以工作:

l = [(0, 0.51634575), (1, 0.113904804), (2, 0.7697494)]
l[l.index((_, max([tuple[1] for tuple in l])))][0]

输出:

2

当然,这是否不构成两个for循环还是有争议的。

另一个仅使用单个for循环的解决方案如下所示:

max_index = -1
max_val = -1
for (index, value) in l:
    if value > max_val:
        max_index = index
        max_val = value
return max_index

答案 2 :(得分:1)

对于一个列表:

b = [(0, 0.11324576), (1, 0.77262518), (2, 0.11417362)]

n = [x[1] for x in b]
print(b[n.index(max(n))][0])

答案 3 :(得分:1)

使用枚举:

i_max=0
for i,t in enumerate(a):
    if (a[i][1] > a[i_max][1]):
        i_max = i
print(i_max)

不使用枚举(假定元组的第一个元素始终等于元组列表中元组的索引):

i_max=0
for t in a:
    if (t[1] > a[i_max][1]):
        i_max = t[0]
print(i_max)

答案 4 :(得分:0)

如果数据是这样的

a = [[(0, 0.51634575), (1, 0.113904804), (2, 0.7697494)],
[(0, 0.20560692), (1, 0.141724408), (2, -0.112972)],
[(0, 0.11324576), (1, 0.77262518), (2, 0.11417362)]]

然后

result = [max(lis,key = lambda x :x[1])[0] for lis in a]

答案 5 :(得分:0)

基线:

test_set = [
  [(0, 0.51634575), (1, 0.113904804), (2, 0.7697494)],
  [(0, 0.20560692), (1, 0.141724408), (2, -0.112972)],
  [(0, 0.11324576), (1, 0.77262518), (2, 0.11417362)],
]

这是没有太多代码打高尔夫球的最短版本:

for test in test_set:
  c, v = zip(*test)
  result = c[v.index(max(v))]
  print(result)

由于代码打高尔夫球实际上很有趣:

for t in test_set:print(max(t,key=lambda x:x[1])[0])

这是最运行时,也可能是最节省内存的版本:

for test in test_set:
  max_elem = test[0]
  for tup in test:
    if tup[1] > max_elem[1]:
      max_elem = tup
  print(max_elem[0])

以上所有摘要的结果:

2
0
1