如何使用子列表替换列表中的字符串

时间:2017-12-25 22:18:04

标签: python string python-3.x list

li = ['a', '#b', 'c']
repl = ['1', '2', '3']

我想用'#b'子列表更改repl,这意味着,这是我想要的输出:

['a', ['1', '2', '3'], 'c']

这是我到目前为止的尝试:

for i in li:
    if i.startswith('#'):
        i.replace(i, repl)

我收到此错误:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-8-151b36fac37c> in <module>()
      1 for i in li:
      2     if i.startswith('#'):
----> 3         i.replace(i, repl)

TypeError: Can't convert 'list' object to str implicitly

5 个答案:

答案 0 :(得分:6)

您不能用列表替换子字符串。相反,使用理解迭代列表:

li = ['a', '#b', 'c']
repl = ['1', '2', '3']
new_li = [repl if i.startswith('#') else i for i in li]

输出:

['a', ['1', '2', '3'], 'c']

如果您不想使用列表推导,您可以写出整个通用循环,也可以使用功能方法:

通用循环:

new_l = []
for i in li:
   if i.startswith('#'):
      new_l.append(repl)
   else:
      new_l.append(i)

功能方法:

new_li = map(lambda x:repl if x.startswith('#') else x, li)

答案 1 :(得分:5)

inplace version

li = ['a', '#b', 'c']
repl = ['1', '2', '3']
for i, item in enumerate(li):
    if item.startswith('#'):
        li[i] = repl

答案 2 :(得分:1)

如果您不想使用列表理解:

li = ['a', '#b', 'c']
repl = ['1', '2', '3']

for count, i in enumerate(li):
    if i.startswith('#'):
        li[count] = repl

print li

['a', ['1', '2', '3'], 'c']

答案 3 :(得分:0)

li = ['a', '#b', 'c']
repl = ['1', '2', '3']

x = li.index('#b')
li[x] = repl
print(li)

这应该给出期望的结果

答案 4 :(得分:0)

您还可以使用基于堆栈的方法:

li = ['a', '#b', 'c']
repl = ['1', '2', '3']

stack = []
for elem in li:
    stack.append(elem)
    if stack[-1].startswith("#"):
        stack.pop()
        stack.append(repl)

print(stack)

哪个输出:

['a', ['1', '2', '3'], 'c']