列表中元组的最大值

7 投票
2 回答
18735 浏览
提问于 2025-04-16 11:36

我遇到了一个问题,我想在一个动态的列表中找到最高的值,这个列表里面包含了多个元组。
这个列表可能长这样:

adymlist = [[('name1',1)],[('name2',2),('name3',1), ...('name10', 20)], ...,[('name m',int),..]]

现在我在这个列表里循环,想找出最高的值(整数):

total = {}
y=0 
while y < len(adymlist):
    if len(adymlist) == 1:
         #has the List only 1 Element -> save it in total 
         total[adymlist[y][0][0]] = adymlist[y][0][1]
         y += 1
    else:
         # here is the problem
         # iterate through each lists to get the highest Value
         # and you dont know how long this list can be
         # safe the highest Value in total f.e. total = {'name1':1,'name10':20, ..}

我尝试了很多方法来找出最大值,但一直没有找到解决办法。我知道我需要遍历列表中的每个元组,并将它与下一个元组进行比较,但我不知道该怎么正确地写代码。

我也可以使用 max() 函数,但它在处理字符串和整数时不太好用。例如,a = [ ('a',5),('z',1)],结果是 max(a) ---> ('z',1),显然5大于1,但因为字母z比a大,所以我尝试用 max(a, key=int) 来扩展max函数,但却出现了类型错误。

希望你能理解我想要表达的意思 ;-)

更新

到目前为止谢谢你们的帮助。

如果我使用 itertools.chain(*adymlist)max(flatlist, key=lambda x: x[1])
我会遇到一个异常,比如: max_word = max(flatlist, key=lambda x: x[1]) TypeError: 'int' object is unsubscriptable

但是如果我使用 itertools.chain(adymlist),就能正常工作。不过我不知道怎么把列表中每个元组的所有整数加起来。我需要你的帮助来解决这个问题。

另外,我为 itertools.chain(*adymlist) 写了一个变通方法,以便得到所有整数的总和和这个列表中的最高整数。

chain = itertools.chain(*adymlist)
flatlist = list(chain)
# flatlist = string, integer, string, integer, ...
max_count = max(flatlist[1:len(flatlist):2])
total_count = sum(flatlist[1:len(flatlist):2])
# index of highest integer
idx = flatlist.index(next((n for n in flatlist if n == max_count)))
max_keyword = flatlist[idx-1]

虽然它仍然能完成我想要的,但这样做是不是太麻烦了?

2 个回答

4

正如spintheblack所说,你有一个包含多个列表的列表,每个列表里又有一些元组。我猜你是想找出所有元组中最大的整数值。

你可以先遍历外面的列表,然后再遍历里面的元组列表,像这样:

max_so_far = 0
for list in adymlist:
  for t in list:
    if t[1] > max_so_far:
      max_so_far = t[1]
print max_so_far

这样写虽然有点多,但可能更容易理解。

16

为了更清楚地说明,看起来你有一个包含多个列表的列表,每个列表里又有多个元组。我们并不关心这些元组在什么列表里,所以可以把这个问题简化为两个步骤:

  • 把列表的列表变成一个元组的列表
  • 找出最大值

第一步可以用 itertools.chain 来实现(你可以参考这个链接:在Python中扁平化一个浅层列表

第二步可以通过 max 函数来解决,你的思路是对的,但你应该传入一个函数,而不是你想要的类型。这个函数需要返回你关注的值,在这里就是元组的第二部分

max(flatlist, key=lambda x: x[1])

更正

我重新读了一遍你的问题——你是在找每个子列表中的最大值吗?如果是这样的话,那么只有第二部分是适用的。只需对你的列表中的每个子列表进行遍历即可

比你现在的写法更符合Python风格的代码可能是这样的:

output = [] 
for lst in lists:
   output.append( max(flatlist, key=lambda x: x[1]) )

或者

map(lambda x:  max(x, key=lambda y: y[1]) , lists)

撰写回答