列表中元组的最大值
我遇到了一个问题,我想在一个动态的列表中找到最高的值,这个列表里面包含了多个元组。
这个列表可能长这样:
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 个回答
正如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
这样写虽然有点多,但可能更容易理解。
为了更清楚地说明,看起来你有一个包含多个列表的列表,每个列表里又有多个元组。我们并不关心这些元组在什么列表里,所以可以把这个问题简化为两个步骤:
- 把列表的列表变成一个元组的列表
- 找出最大值
第一步可以用 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)