如何在一个包含字符串和数字的列表的列表中找到具有最大值的列表?

5
我有一个列表,它由多个列表组成。
list_of_lists = [['a',1,19,5]['b',2,4,6],['c',22,5,9],['d',12,19,20]]

我希望获取具有最高值的前x个列表,因此 max(list_of_lists) 返回前3个最高值。

[['c',22, 5,9],['d',12,19,20],['a',1,19,5]]

如果我正在遍历list_of_lists,我可以将每个列表的前x个最大值附加到另一个列表中,基于所选列表的索引。

这是我正在使用的代码,但它有缺陷,因为我认为我需要在每个循环结束时删除所选答案,以便它不会出现在下一个循环中,并且它仅查看第4列(x [3])。

for y in case_list:
    last_indices = [x[3] for x in case_list]
    print("max of cases is: ",max(last_indices))

现在的输出结果是:

max of cases is:  22
max of cases is:  22
max of cases is:  22

这个答案给出了最大的列表,但我希望具有返回前x个而不仅仅是一个的灵活性。
这个答案在单个列表中给出了前x个最大值。

1
你的列表中的abcd项是字符串(并且你漏掉了引号),还是它们是对先前定义的变量的引用? - benvc
1
第一个是字符串,其余的都是整数值。谢谢 - Jazzmine
1
你可以使用numpy并进行argsort操作。然后使用unravel_index获取2D索引,保留第一列中的前x行,得到的就是前x个最大值的索引。 - ZisIsNotZis
1个回答

4

如果您的嵌套列表始终只在第一个索引处有一个字符串(就像您的示例一样),那么您可以使用max()对每个嵌套列表的切片(不包括第一项)进行排序,然后根据您想要的“顶部”结果数量来切割最终输出。以下是获取具有最大值的“前3个”列表的示例。

list_of_lists = [['a',1,19,5],['b',2,4,6],['c',22,5,9],['d',12,19,20]]

# sort nested lists descending based on max value contained
sorted_list = sorted(list_of_lists, key=lambda x: max(x[1:]), reverse=True)

# slice first 3 lists (to get the "top" 3 max values)
sliced_list = sorted_list[:3]

print(sliced_list)  
# OUTPUT
# [['c', 22, 5, 9], ['d', 12, 19, 20], ['a', 1, 19, 5]]

你可以将其转换为一个简单的函数来获取嵌套列表中前x个元素(函数后面的循环只是为了打印类似于你的示例)。
def max_lists(data, num):
    results = sorted(data, key=lambda x: max(x[1:]), reverse=True)
    return results[:num]

list_of_lists = [['a',1,19,5],['b',2,4,6],['c',22,5,9],['d',12,19,20]]

top_three = max_lists(list_of_lists, 3)

print(top_three)                     
for x in top_three:
    print(f'max value: {max(x[1:])} list: {x}')

# OUTPUT
# [['c', 22, 5, 9], ['d', 12, 19, 20], ['a', 1, 19, 5]]
# max value: 22 list: ['c', 22, 5, 9]
# max value: 20 list: ['d', 12, 19, 20]
# max value: 19 list: ['a', 1, 19, 5]

非常感谢!将所选内容复制到另一个列表中的最佳位置是在max_lists函数中还是将top_three复制到另一个列表中?您能分享一下我该如何做吗?再次感谢。 - Jazzmine
另外,您能解释一下如何跨越检查所有列吗?这是我不理解代码的唯一部分。 - Jazzmine
2
嗨benvc - 我想使用每个列表中的三个int列中的最高值,并在至少有一个值在前x个的列表的列表中找到前三个列表,而不重复使用行。这样说是否有帮助?我认为你提供的代码是正确选择具有22、20和19的列表,而不考虑已经使用过的19和20列表。这有助于澄清我正在寻求什么吗? - Jazzmine
@Jazzmine - 是的,在这种情况下,我们是在正确的轨道上。编辑了答案,简化为仅返回一个列表的列表,因为这似乎是您真正想要的(而不是带有列表和最大值的元组)。您可以在打印循环中看到如何轻松获取需要显示的最大值。 - benvc
@Jazzmine max() 接受一个列表作为参数,并在列表中找到最大值。由于您的列表在索引0处包含字符串值,因此我将传递从索引1开始的列表切片 [1:]max() 函数,以便在列表中查找不包括字符串值的最高值。sorted() 函数正在迭代列表的列表,并将 max() 函数应用于每个嵌套列表。明白了吗? - benvc
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接