我希望在序列's'中找到最后一个项'x',或者如果没有,则返回None,并且第一项的位置等于0
这就是我目前所拥有的:
def PositionLast (x,s):
count = len(s)+1
for i in s:
count -= 1
if i == x:
return count
for i in s:
if i != x:
return None
当我尝试:
>>>PositionLast (5, [2,5,2,3,5])
>>> 4
这是正确的答案。但是,当我将'x'更改为2而不是5时,我得到了这个:
>>>PositionLast(2, [2,5,2,3,5])
>>> 5
这里的答案应该是2。 我很困惑这是如何发生的,如果有人能解释我需要纠正的事情,我将不胜感激。 我还想用最基本的代码完成这个。
谢谢。
答案 0 :(得分:6)
为了有效地执行此操作,enumerate按reverse顺序排列并返回第一个匹配项的索引(默认情况下为None
),例如:
def PositionLast(x, s):
for i, v in enumerate(reversed(s)):
if v == x:
return len(s) - i - 1 # return the index in the original list
return None
避免使用切片表示法(例如s[::-1]
)反转列表,因为这会在内存中创建一个新的反转列表,这对于任务来说不是必需的。
答案 1 :(得分:3)
您的逻辑不正确,因为如果i==x
返回计数,并且在函数尾随处有一个额外的循环。
而是循环遍历列表的枚举的反向形式并返回第一次出现的索引:
def PositionLast (x,s):
return next(i for i,j in list(enumerate(s))[::-1] if j == x)
演示:
print PositionLast (2, [2,5,2,3,5,3])
2
print PositionLast (3, [2,5,2,3,5,3])
5
print PositionLast (5, [2,5,2,3,5,3])
4
答案 2 :(得分:2)
您的代码错误,它从头开始检查列表并在第一场比赛时停止,您想要的是以相反的顺序检查列表。
def PositionLast (x,s):
count = len(s)
for i in s[::-1]:
count -= 1
if i == x:
return count
return None
你的第一行只是因为巧合才给你正确答案:
- 检查第一项时,计数等于5
- 检查第二项时计数等于4,匹配,然后返回4.
- 巧合的是,这是你最后一项的索引。
答案 3 :(得分:2)
以相反的顺序迭代列表,然后检查x。这可能是一种有效的方式,作为逆转列表,然后从头开始寻找索引是资源密集型。
def PositionLast (x,s):
for i in range(len(s)-1,0,-1):
if s[i] == x:
return i
return None
答案 4 :(得分:1)
def positionLast(x, L):
answer = None
for i,e in enumerate(L):
if e==x: answer = i
return answer
答案 5 :(得分:0)
def positionLast(x, L):
try: return max(i for i,e in enumerate(L) if e==x)
except: return None
答案 6 :(得分:0)
感谢大家的回复和帮助!不幸的是没有人得到我想要的答案,但无论我最终自己解决了什么,但非常感谢你们!
以下是最终代码:
def PositionLast(x,s):
count = -1
position = None
for i in s:
count += 1
if i == x:
position = count
return position
这将返回我所有测试的正确答案。
谢谢,Eimear。
答案 7 :(得分:-2)
public class BoxCreatedHandler : INotificationHandler<BoxCreated>
{
private readonly IBoxRepository _repo;
public BoxCreatedHandler(IBoxRepository repo)
{
_repo = repo;
}
public async Task Handle(BoxCreated e, CancellationToken ct)
{
Box b = JsonConvert.DeserializeObject<Box>(e.Data);
_repo.CreateBox(b);
// QUESTION: do I just go ahead and do my stock and location update here using another injected repo?
// Or should I register another handler for this event that does the update?
// todo: how to handle read db update errors here? Will need to queue a aggregate replay to rebuild the read db?
}
}