我有一个由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个字符串组成的列表,其中两个始终相等。我想找出其中不同的那个。这个问题听起来很简单,但我一直没有找到一种真正优雅的方法来解决它。
例如,列表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)
这里有更好的方式吗?
您可以查找最后一个值的第一次出现:
ans = (1, 0, 2)[lst.index(lst[2])]
如果你可以接受索引 -1
而不是 2
:
ans = 1 - lst.index(lst[2])
关于什么?
0 if lst[1] == lst[2] else 1 if lst[0] == lst[2] else 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)
。
lst.index(min(lst, key=lambda i: lst.count(i)))
那行代码不会返回索引位置吗? - Pro Chesslst.count
外面再包一层lambda函数? - Kelly Bundy