我想替换由字符串和子列表组成的列表中出现的所有字符串,如下所示:
myarray = ['Hello', 'how', 'how', ['are', 'what', 'how'], 'you', 'how']
将改为:
myarray = ['Hello', 'X', 'X', ['are', 'what', 'X'], 'you', 'X']
到目前为止,我只能替换'如何'这是字符串而不是在子列表中。这是我目前的代码:
myarray = ['Hello', 'how', 'how', ['are', 'what', 'how'], 'you', 'how']
for n, i in enumerate(myarray):
for sublist in myarray:
if i == 'how':
myarray[n]="X"
print myarray
以及它的输出:
['Hello', 'X', 'X', ['are', 'what', 'how'], 'you', 'X']
我有什么想法可以解决这个问题吗?
答案 0 :(得分:2)
我会为此编写一个递归函数。
def nestrepl(lst, what, repl):
for index, item in enumerate(lst):
if type(item) == list:
nestrepl(item, what, repl)
else:
if item == what:
lst[index] = repl
演示:
>> nestrepl(myarray, 'how', 'X')
>> myarray
['Hello', 'X', 'X', ['are', 'what', 'X'], 'you', 'X']
答案 1 :(得分:0)
虽然Python中通常不会批准类型检查,但是必须处理这样的递归数据结构,其中原始列表的元素可以是数据点或子列表。诀窍是用递归函数处理它们。
myarray = ['Hello', 'how', 'how', ['are', 'what', 'how'], 'you', 'how']
def subst(lst, val, rep):
result = []
for item in lst:
if type(item) == list:
result.append(subst(item, val, rep))
elif item == val:
result.append(rep)
else:
result.append(item)
return result
print(subst(myarray, "how", "X"))
为您提供所需的输出。
你可以像在@ timgeb的回答一样,根据需要更换现有的项目 - 如果需要原始列表,我会以这种方式制定我的答案,但如果没有,那么替换可能会更有效。
答案 2 :(得分:0)
我无法想到导入的解决方案,所以像上面的编写者一样,我会写一个更高阶的递归函数:
def full_replace(array, string):
new_array = []
if isinstance(array, str):
return 'X' if array == string else string
else:
for n in array:
new_array.append(full_replace(n, string))
return new_array
答案 3 :(得分:0)
最好使用递归函数来解决这个问题!
def replace(item_want_to_replace, replacement, list_input):
for sublist in list_input:
if type(sublist) == list:
list_input = replace(item_want_to_replace, replacement, sublist)
else:
if sublist == item_want_to_replace:
sublist = replacement
return list_input
if __name__ == '__main__':
myarray = ['Hello', 'how', 'how', ['are', 'what', 'how'], 'you', 'how']
new_array = replace('how', 'X', myarray)
print(new_array)
以下是我的代码的解释:我创建了一个函数,可以获得3个变量 item_want_to_replace ,以及 替换 作为字符串, list_input 作为列表或嵌套列表。然后,我使用 for 循环扫描 list_input ,并检查每个子列表的类型是否为列表。如果子列表是一个列表,我将 list_input 分配给一个新值,因为我们还需要更改该列表中的值;因此,我再次调用该函数(递归方法,如果列表中有列表,它会一遍又一遍), list_input 将有一个新的固定值,即已经将'how'更改为当前列表中列表中的“X”。之后, else 语句只是用于检查子列表是否与 item_want_to_replace (即')相同的条件在这种情况下如何')。然后,它会将子列表指定为 替换 并返回 list_input 以应用递归,如上所述!
答案 4 :(得分:-1)
您不需要递归:
for ind,elem in enumerate(myarray[:]):
if isinstance(elem,list):
for sub_ind,sub_elem in enumerate(elem):
if sub_elem =="how":
myarray[ind][sub_ind] = "X"
elif elem == "how":
myarray[ind] = "X"
In [4]: myarray
Out[4]: ['Hello', 'X', 'X', ['are', 'what', 'X'], 'you', 'X']