用另一个列表的内容替换列表项

发布于 2021-01-29 15:04:29

此问题类似,但我不想将一个项目的任何出现都替换为列表的内容,而不是将另一个项目替换为另一个。

orig = [ 'a', 'b', 'c', 'd', 'c' ]
repl = [ 'x', 'y', 'z' ]
desired = [ 'a', 'b', 'x', 'y', 'z', 'd', 'x', 'y', 'z' ]

# these are all incorrect, or fail to compile
[ repl if x == 'c' else x for x in orig ]
[ [a for a in orig] if x == 'c' else x for x in orig ]
[ (a for a in orig) if x == 'c' else x for x in orig ]
[ a for a in orig if x == 'c' else x for x in orig ]

编辑:明确表示我打算替换 所有 出现的项目,而不仅仅是第一个。(对未在回答中涉及此情况的任何人表示歉意。)

关注者
0
被浏览
81
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    不同的方法:当我进行替换时,我更喜欢从字典的角度进行思考。所以我会做类似的事情

    >>> orig = [ 'a', 'b', 'c', 'd' ]
    >>> rep = {'c': ['x', 'y', 'z']}
    >>> [i for c in orig for i in rep.get(c, [c])]
    ['a', 'b', 'x', 'y', 'z', 'd']
    

    最后一行是标准拼合成语。

    这种方法的一个优点(劣势?)是它将处理的多次出现'c'

    [更新:]

    或者,如果您愿意:

    >>> from itertools import chain
    >>> list(chain.from_iterable(rep.get(c, [c]) for c in orig))
    ['a', 'b', 'x', 'y', 'z', 'd']
    

    关于修改后的测试用例:

    >>> orig = [ 'a', 'b', 'c', 'd', 'c' ]
    >>> rep = {'c': ['x', 'y', 'z']}
    >>> list(chain.from_iterable(rep.get(c, [c]) for c in orig))
    ['a', 'b', 'x', 'y', 'z', 'd', 'x', 'y', 'z']
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看