我正在尝试找到一种方法来扁平化我的列表,以便它输出:
['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 d
和d[x]
访问之间的分离。如果另一个线程完全删除了 d
引用的字典中的该条目,则测试成功,但访问仍然失败。