从数组中获取第一个先前的非匹配元素

时间:2017-12-11 10:19:15

标签: python list

我想在向后迭代时获取第一个非匹配元素。

这是我的输入数组:

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)]

3 个答案:

答案 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,如果它们不是最近几年使用的话。