q kdb+:通过列表匹配查找元素索引及in\运算符解析
嘿,我来帮你把这个问题掰明白!
先说说
in运算符的作用原理 你输入的b in a其实是在做存在性检查——它会判断b这个元素是否存在于可迭代对象a(比如你这里的列表)中,返回的是布尔值True或者False,而不是元素的位置哦。
举个实际例子:
a = ["apple", "banana", "cherry"] b = "banana" print(b in a) # 输出 True b = "date" print(b in a) # 输出 False
底层运行逻辑上,对于列表这种序列类型,in会从第一个元素开始逐个遍历对比,一旦找到和b匹配的元素,就立刻返回True;如果遍历完整个列表都没找到匹配项,就返回False。这种线性查找的方式在列表很大的时候效率不算高,如果你需要频繁做存在性检查,换成集合(set(a))会快很多,因为集合用的是哈希查找。
怎么获取你想要的元素位置
根据你的需求,分两种常见情况来说:
情况1:b是单个元素,找它在a里的索引
用列表的index()方法就可以直接拿到第一个匹配元素的位置:
a = [10, 20, 30, 20] b = 20 print(a.index(b)) # 输出 1(因为第一个20在索引1的位置)
不过要注意:如果b不在a里,index()会直接抛出ValueError报错。所以稳妥一点的做法是先通过in判断存在性,再调用index():
if b in a: print(f"元素{b}的位置是:{a.index(b)}") else: print(f"元素{b}不在列表a中")
如果想拿到所有匹配元素的位置,可以用列表推导式结合enumerate():
all_positions = [i for i, elem in enumerate(a) if elem == b] print(all_positions) # 对于上面的例子,输出 [1, 3]
情况2:b是一个子列表,找它在a中的起始位置
比如你想找b = [20,30]在a = [10,20,30,40]里的起始索引(这里是1),可以自己写个小函数来实现:
def find_sublist_start(a, b): len_b = len(b) # 遍历所有可能的起始位置 for i in range(len(a) - len_b + 1): # 切片对比子列表 if a[i:i+len_b] == b: return i return -1 # 没找到返回-1 a = [10,20,30,40] b = [20,30] print(find_sublist_start(a, b)) # 输出 1
内容的提问来源于stack exchange,提问作者Wilfred Cho
相关产品推荐
相关产品推荐

