寻找异常值位置的最优雅方法

3

我有一个由3个字符串组成的列表,其中两个始终相等。我想找出其中不同的那个。这个问题听起来很简单,但我一直没有找到一种真正优雅的方法来解决它。

例如,列表lst = ['foo', 'bar', 'foo'],应该返回1。我目前的做法是:

f = lambda x, y, z: {(0, 0): 0, (0, 1): 1}.get((x == y, x == z), 2)
ans = f(*lst)

这里有更好的方式吗?

3个回答

10

您可以查找最后一个值的第一次出现:

ans = (1, 0, 2)[lst.index(lst[2])]

如果你可以接受索引 -1 而不是 2

ans = 1 - lst.index(lst[2])

2

关于什么?

0 if lst[1] == lst[2] else 1 if lst[0] == lst[2] else 2

2

一个简单的方法,虽然不是非常高效:

odd_one_out = min(lst, key=lst.count)

获取索引:
odd_one_out_index = min(enumerate(lst), key=lambda i: lst.count(i[1]))[0]

这个函数会计算列表中每个元素出现的频率,然后选择出现次数最少的元素。请注意,尽管如此,它的效率为 O(N^2)


谢谢您的回答。实际上我想知道奇数位置的索引位置。 - Ma0
我已经更新了我的答案以获取索引。 - mousetail
1
@mousetail lst.index(min(lst, key=lambda i: lst.count(i))) 那行代码不会返回索引位置吗? - Pro Chess
为什么要在本来就很好的函数lst.count外面再包一层lambda函数? - Kelly Bundy
@ProChess 这需要对列表进行另一次遍历才能找到该项。 - alercelik

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