假设我有一个这样的元组列表(没有任何数字的重复):
lst = [(4, 1), (3, 8), (2, 9), (5, 6), (7, 0)]
我知道元素值a
,我想找到配对值b
但是,我不知道a
是否是元组的第一个或第二个元素。
有没有办法轻松干净地找到它?
我试过了:
a = 8
pair = next(t for t in lst if t[0] == a or t[1] == a)
b = pair[0] if pair[1] == a else pair[1]
这看起来不太好......是否存在更聪明的事情?
答案 0 :(得分:2)
O(n)中的双向地图存在一个非常酷的技巧。首先,你必须压扁你的清单:
l = [1, 4, 3, 8, 9, 2, 5, 6, 7, 0]
然后找到一个相关元素非常简单:
a = 8
b = l[l.index(a) ^ 1]
这是有效的,因为如果数字为偶数,则带1的数字加1,如果数字为奇数则加1。
答案 1 :(得分:1)
使用列表理解。
>>> lst = [(1, 4), (3, 8), (9, 2), (5, 6), (7, 0)]
>>> next(y if 8 == x else x for x,y in lst if 8 in (x,y))
3
>>> next(x[1] if 8 == x[0] else x[0] for x in lst if 8 in x)
3
答案 2 :(得分:1)
怎么样:
>>> lst = [(1, 4), (3, 8), (9, 2), (5, 6), (7, 0)]
>>> a = 8
>>> next([i[i.index(a) ^ 1] for i in lst if a in i])
3
>>> a = 4
>>> next(i[i.index(a) ^ 1] for i in lst if a in i)
1
>>> a = 7
>>> next(i[i.index(a) ^ 1] for i in lst if a in i)
0
答案 3 :(得分:0)
如果您的lst
未更改,并且您正在执行多次查找,则可以按线性时间(O(n)
)构建查找表,以便在固定时间内获得答案(O(1)
)或平均情况下接近它。
如果您的lst
包含连续的整数,其中一个是0
,则可以使用列表作为查找表来获取 O(1)
查找:
lookup = [None] * len(lst) * 2
for x, y in lst:
lookup[x] = y
lookup[y] = x
print(lookup[4]) # 1
如果没有,您可以使用dict
代替(更慢的查找,更多可能性)。您可以随时轻松切换到它,因为它可以与上面的列表类似地构建:
lookup = {}
for x, y in lst:
lookup[x] = y
lookup[y] = x
它也可以以功能方式构建:
from itertools import chain
flatten = chain.from_iterable
dct = dict(flatten(((x, y), (y, x)) for x, y in lst))
答案 4 :(得分:0)
你可以这样做
lst = [(4, 1), (3, 8), (2, 9), (5, 6), (7, 0)]
#number to be searched
num = 3
x = list(filter(lambda y: num in y, lst))
if x:
x = list(x[0])
x.remove(num)
print(x)
else:
print('Not Found')