从 Python 中的递归函数展平列表



我正在尝试找到一种方法来扁平化我的列表,以便它输出:

['one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine']

到目前为止,我的递归函数返回一个新的嵌套值列表,其中包含字典中的匹配键(使用旧参数列表和字典),如下所示:

l = ['won', 'too', 'three', 'fore', 'five', 'six', 'seven', 'ate', 'nein']
d = dict(won='one', too='two', fore='four', ate='eight', nein='nine')
def subst(l,d):
     if len(l) == 1:
         if l[0] in d:
             return d[l[0]]
         else:
             return l[0]
     else:
         return [d[l[0]] if l[0] in d else l[0]] + [subst(l[1:],d)]

到目前为止,我一直得到:

['one', ['two', ['three', ['four', ['five', ['six', ['seven', ['eight', 'nine']]]]]]]]

有什么方法可以在保持函数递归完整性的同时扁平化列表?

map(lambda x: d[x] if x in d else x,l)

您可以省略递归subst()调用周围的[]

或者,你可以做

def subst(l, d):
    return [d.get(i, i) for i in l]

它只是遍历列表并用 d 中的相应条目替换每个项目,如果有的话,创建一个包含结果的新列表。

如果你宁愿保留列表,你可以这样做

def subst(l, d):
    for n, i in enumerate(l):
        l[n] = d.get(i, i)

在同时删除的答案中,有人询问了[d[x] for x in l if x in d]的竞争条件。

争用条件 - 在线程程序的情况下 - 包括if x in dd[x]访问之间的分离。如果另一个线程完全删除了 d 引用的字典中的该条目,则测试成功,但访问仍然失败。

相关内容

  • 没有找到相关文章

最新更新