我有一个问题是在动态元组列表中获得最高价值 列表可能如下所示:
adymlist = [[('name1',1)],[('name2',2),('name3',1), ...('name10', 20)], ...,[('name m',int),..]]
现在我遍历List以获得最高值(整数):
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()
,但它不能用于字符串和整数。 F.E.
a = [ ('a',5),('z',1)]
- &gt;结果是max(a) ---> ('z',1)
obv 5&gt; 1但是z>所以我尝试用max(a, key=int)
扩展max函数,但是我得到了一个Type Error。
希望你能理解我想要的东西; - )
如果我使用itertools.chain(*adymlist)
和max(flatlist, key=lambda x: x[1])
,我会得到一个例外:max_word = max(flatlist,key = lambda x:x [1])
TypeError:'int'对象是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]
它仍然可以做我想要的,但不是很脏吗?
答案 0 :(得分:16)
澄清一下,看起来你已经有了元组列表的列表。看起来我们并不关心它们所在的列表,因此我们可以将其简化为两个步骤
第一部分可以通过itertools.chain
完成(参见例如Flattening a shallow list in Python)
第二个可以通过max解决,你有正确的想法,但你应该传递一个函数而不是你想要的类型。此函数需要返回您键入的值,在本例中为元组的第二部分
max(flatlist, key=lambda x: x[1])
<强>校正强>
我重新阅读了您的问题 - 您是否在寻找每个子列表中的最大值?如果是这种情况,那么只有第二部分适用。只需遍历每个列表的列表
比你现在想要的更加pythonic
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)
答案 1 :(得分: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
这有点冗长,但可能更容易理解。