【问题标题】:Comparing items of a tuple within a list of tuples比较元组列表中元组的项目
【发布时间】:2018-03-09 21:36:32
【问题描述】:

我设计了一个程序来计算列表中的一些最大元组,但是我被困在必须比较一个元组中的最大值 item[1] 并将其与另一个元组 item[1] 进行比较的地步。 这是元组列表:

fff = []
anslist = [(2, [1]), (3, [7]), (4, [2]), (5, [5]), (6, [8]), (7, [16]), (8, [3]), (9, [19]), (10, [6]), (11, [14]), (12, [9]), (13, [9]), (14, [17]), (15, [17]), (16, [4]), (17, [12]), (18, [20]), (19, [20]), (20, [7])]

这是我的代码:

print(max(anslist, key=lambda x: x[1]))
fff.append(max(anslist, key=lambda x: x[1]))
anslist.remove(max(anslist, key=lambda x: x[1]))
while (max(fff[1], key=lambda x: x[1])) == (max(anslist[1], key=lambda x: x[1])):
     print(max(anslist, key=lambda x: x[1]))
     anslist.remove(max(anslist, key=lambda x: x[1]))

我希望我的程序能够打印 (18, [20]) 和 (19, [20]),因为元组列表总是根据用户的输入而变化,所以我需要某种需要通过的循环所有元组,直到元组的第二项不再是最大的。

这是我得到的错误:

while (max(fff[1], key=lambda x: x[1])) == (max(anslist[1], key=lambda x: x[1])):
IndexError: list index out of range

【问题讨论】:

  • 我已将您的问题编辑得更好一些,但请edit 它包括您的代码尝试如何无法解决问题。给出真实的输出——“不工作”是完全无用的信息。
  • 与您的问题无关的快速提示:当您发现自己多次传递相同的lambda 时,请将其分配给一个变量并改为传递该变量。这种方法的一个好处是,如果您想修改lambda 的工作方式,您只需在一个地方进行更改。

标签: python math lambda tuples list-comprehension


【解决方案1】:

问题在于您的下标[1] 位置错误。

代替:

while (max(fff[1], key=lambda x: x[1])) == (max(anslist[1], key=lambda x: x[1])):

这就是你想要的:

while max(fff, key=lambda x: x[1])[1] == max(anslist, key=lambda x: x[1])[1]:

如您所愿,打印出(19, [20])

(我还从您的表达式中删除了所有不需要的括号。)

一个更有效的方法是只找到一次最大值并根据它过滤列表:

max_element = max(x[1] for x in anslist)
max_tuples = [x for x in anslist if x[1] == max_element]

另外有趣的是排序 anslist 以将 (18, [20])(19, [20]) 放在前面,之后您可以使用简单的 for 循环并在元组的第二个元素发生变化时中断。

sorted_anslist = sorted(anslist, key=lambda x: x[1], reverse=True)

【讨论】:

  • 非常感谢您的工作。我还在学习提高效率,非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-03
  • 1970-01-01
  • 1970-01-01
  • 2022-07-22
  • 1970-01-01
  • 2015-08-01
  • 2021-06-24
相关资源
最近更新 更多