我想在向后迭代时获取第一个非匹配元素。
这是我的输入数组:
data = ['2017','No 1','No 2','2018','No 3','No 4','No 5']
而且,预期的结果是,
['2017', '2017', '2017', '2018', '2018', '2018', '2018']
字符串"No 1"
和"No 2"
必须映射到字符串"2017"
。
基本上我想通过迭代前一个来返回与"No"
不匹配的字符串。
以下代码片段符合我的预期,但我想知道有更好的方法吗
def get_name(i, d):
if d.find('No') >= 0:
return get_name(i - 1, data[i - 1])
else:
return d
[get_name(i,d) for i,d in enumerate(data)]
答案 0 :(得分:2)
记住最后一个“好”的项目,并产生一个或实际的项目。
def func(lst, default=None):
last = default
for e in lst:
last = e if not e.startswith("No") else last
yield last
>>> data = ['2017','No 1','No 2','2018','No 3','No 4','No 5']
>>> list(func(data))
['2017', '2017', '2017', '2018', '2018', '2018', '2018']
答案 1 :(得分:1)
我正在努力弄清楚你究竟想要达到的目标。如果你只想继续用最后一个不匹配替换列表中的元素,你可以用更低的复杂度和没有递归来做到:
Seed
答案 2 :(得分:1)
可能没必要,但您也可以尝试基于堆栈的方法:
def get_name(lst, match):
result = []
stack = []
for elem in lst:
if elem.startswith(match):
if stack:
top = stack[-1]
result.append(top)
else:
result.append(None)
else:
stack.append(elem)
result.append(elem)
return result
print(get_name(['2017','No 1','No 2','2018','No 3','No 4','No 5'], "No"))
# ['2017', '2017', '2017', '2018', '2018', '2018', '2018']
print(get_name(['No1','No 2','No 3','2018','No 4','No 5','No 6'], "No"))
# [None, None, None, '2018', '2018', '2018', '2018']
print(get_name(['No1','No 2','No 3','2017','No 4','2018','No 6'], "No"))
# [None, None, None, '2017', '2017', '2018', '2018']
此处的默认值为None
,如果它们不是最近几年使用的话。