替换列表中子列表中所有出现的项目

时间:2014-07-01 17:44:29

标签: python string list python-2.7

我想替换由字符串和子列表组成的列表中出现的所有字符串,如下所示:

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

我有什么想法可以解决这个问题吗?

5 个答案:

答案 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']