如何在指定项之后的列表/字符串/范围中找到特定项?

  • 本文关键字:范围 字符串 列表 之后 python
  • 更新时间 :
  • 英文 :


给定输入任何类型的序列(列表/字符串/范围),我如何在输入中找到下一个项目按照指定的项目吗?

同样,如果项不存在或后面没有任何项,该函数应该返回None

我尝试将输入类型转换为列表,然后从列表中找到位置,然后获得下一个项目,但这并不适用于所有输入类型。我写了一些东西,但我知道它不是python的,而且它也超时了。(codewars挑战:https://www.codewars.com/kata/542ebbdb494db239f8000046/train/python)

我的尝试:

def next_item(xs, item):
xs_list = list(xs)
if item in xs_list:
position = xs_list.index(item)
try:
return xs_list[position+1]
except IndexError:
return None
else:
return None

预期结果:

next_item([1, 2, 3, 4, 5, 6, 7, 8], 5)
# 6)
next_item(['a', 'b', 'c'], 'd')
# None)
next_item(['a', 'b', 'c'], 'c')
# None)
next_item('testing', 't')
# # 'e')
next_item(iter(range(1, 3000)), 12)
# , 13)

简单解决方案:

def next_item(xs, item):
it = iter(xs)
item in it
return next(it, None)

item in it尝试找到该项,并因此消耗该迭代器,直到找到该项或直到到达终点。

可以使用next返回指定元素之后的元素:

def next_item(seq, e):
iterable = iter(seq)
for i in iterable:
if i == e:
return next(iterable, None)
return None

print(next_item([1, 2, 3, 4, 5, 6, 7, 8], 5))
print(next_item(['a', 'b', 'c'], 'd'))
print(next_item(['a', 'b', 'c'], 'c'))
print(next_item('testing', 't'))
print(next_item(iter(range(1, 3000)), 12))

6
None
None
e
13

试试这个:

def next_item(seq, item):
seq = iter(seq)
return next(next((seq for it in seq if item == it), seq), None)

测试后最快解决方案,

def next_item(ls,item):
try:
return ls[ls.index(item)+1]
except:
None

运行这个需要0.886。

这里有一些其他的解决方案,

  1. 使用for循环
def next_item(ls,item):
for i in range(len(ls)):
if ls[i] == item:
return ls[i+1]
return None
next_item(range(100000000),9999999)

1.862

[10000000]
  1. Usinglist.index()
def next_item(ls,item):
try:
return ls[ls.index(item)+1]
except:
None
next_item(range(100000000),9999999)

0.886

[10000000]
  1. 最短但是,没有输出为[],任何答案都在列表中,例如:[1]
def next_item(ls,item):
return [ls[i+1] for i in range(len(ls)) if ls[i] == item]
next_item(range(100000000),9999999)

16.481

[10000000]
  1. (3)问题解决
def next_item(ls,item):
a = [ls[i+1] for i in range(len(ls)) if ls[i] == item]
if a == []:
return None
else:
return a[0]
next_item(range(100000000),9999999)

16.389

[10000000]
  1. 大家都这么说,
def next_item(ls, item):
ls = iter(ls)
return next(next((ls for i in ls if item == i), ls), None)
next_item(range(100000000),9999999)

0.994

[10000000]

最新更新