Python列表 - 查找值及其位置

3
我正在寻找一个列表中最大的数,然后获取它前面第1个元素的位置。如果有人知道如何做到这一点,将不胜感激。
my_list = ['room', 10, 'chamber', 23, 'kitchen', 8]

pos = my_list.aMethodToGetTheGreatestValuePosition()

print('The biggest room is ' + my_list[pos-1])

这回答了你的问题吗?(我不这么认为) - deadcode
我重新打开了它,因为这个问题不完全是重复的,它是一个独特的案例(包含混合字符串和整数)。 - jamylak
4个回答

1
这样做可以避免多次遍历列表:
my_list = ['room', 10, 'chamber', 23, 'kitchen', 8]

pos = max(enumerate(my_list[1::2]), key=lambda x: x[1])[0]

print('The biggest room is ' + my_list[2*pos])

这段内容涉及编程,使用了enumerate函数来同时获取my_list中的索引和查找最大值。
或者你可以稍微巧妙一些,使用zip函数:
print('The biggest room is ' +  max(zip(*[iter(my_list)]*2), key=lambda x: x[1])[0])

该方法依赖于使用相同的迭代器在my_list上提供连续的值给zip(从另一个优秀答案中借用)。这本质上将您的平面列表转换为元组列表,如果您有这个选项,则这将是存储原始数据的更好方式:
>>> list(zip(*[iter(my_list)]*2))
[('room', 10), ('chamber', 23), ('kitchen', 8)]

0
这里有一种方法。请注意,这需要结构,即先房间,然后按大小顺序。我认为这不是一个坏主意,因为你应该使用字典或元组列表。
my_list = ['room', 10, 'chamber', 23, 'kitchen', 8]

pos = my_list.index(max(my_list[1::2]))  # 23

print('The biggest room is ' + my_list[pos-1])  # chamber

我要注意的是,str(...)是无用的。 - jamylak
@jamylak 同意并修改 - jpp
那个 index 调用意味着你必须遍历列表两次。 - Turn
@jamylak,是的,我并不是说解决方案是错误的,只是想指出一些人似乎认为index执行某种神奇的反向哈希查找。对于我的简洁表示,我深表歉意。 - Turn
1
没问题,我只是觉得好像人们仅仅因为这个原因而进行了负面评价,所以决定总体上解决这个问题。 - jamylak
显示剩余4条评论

0
my_list = ['room', 10, 'chamber', 23, 'kitchen', 8]

my_list[my_list.index(max(filter(lambda x: isinstance(x, int), my_list)))-1]

假设输入列表中有两个相等的最大数,程序将只会选择第一个。这将成为解决方案的限制。


-1

这样怎么样:

my_list = ['room', 10, 'chamber', 23, 'kitchen', 8]

max_index = max(range(len(mylist)),
                key=lambda i: my_list[i] if isinstance(my_list[i], int) else float('-inf'))
max_name = my_list[max_index-1]

我建议您尽可能更改数据格式。将数字映射到名称的字典(或名称到数字)会更自然。即使是列表中的列表也可能更容易处理。

我对你目前提出的建议很感兴趣,你能给我一个数据格式结构的链接,这样我就可以自己学习了吗?否则,谢谢你抽出时间。 - Miloertas
1
字典在Python中非常基础。请阅读官方Python教程(我特别链接了字典部分,但整个页面都值得一读)。你可以使用{'room': 10, 'chamber': 23, 'kitchen': 8}或类似的东西。比交错列表容易处理多了。 - Blckknght

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