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

时间:2014-02-12 09:16:36

标签: python list recursion dictionary

我正试图找到一种方法来压缩我的列表,以便输出:

['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']]]]]]]]

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

2 个答案:

答案 0 :(得分:1)

您可以省略递归[]电话周围的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)

同时删除的答案someone asked,关于[d[x] for x in l if x in d]中的竞争条件。

竞争条件 - 在线程程序的情况下 - 包括if x in dd[x]访问之间的分隔。如果另一个线程正好删除d引用的dict中的那个条目,则测试成功,但访问仍然失败。

答案 1 :(得分:1)

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