8

我有一个字符串列表列表,例如:

example = [["string 1", "a\r\ntest string:"],["string 1", "test 2: another\r\ntest string"]]

我想"\r\n"用空格替换(并":"在所有字符串的末尾去掉)。

对于普通列表,我会使用列表理解来删除或替换类似的项目

example = [x.replace('\r\n','') for x in example]

甚至是 lambda 函数

map(lambda x: str.replace(x, '\r\n', ''),example)

但我无法让它适用于嵌套列表。有什么建议么?

4

4 回答 4

16

好吧,想想你的原始代码在做什么:

example = [x.replace('\r\n','') for x in example]

您在.replace()列表的每个元素上使用该方法,就好像它是一个字符串一样。但是这个列表的每个元素都是另一个列表!你不想调用.replace()子列表,你想调用它的每个内容。

对于嵌套列表,请使用嵌套列表推导!

example = [["string 1", "a\r\ntest string:"],["string 1", "test 2: another\r\ntest string"]]
example = [[x.replace('\r\n','') for x in l] for l in example]
print example

[['string 1', 'atest string:'], ['string 1', 'test 2: anothertest string']]
于 2012-12-08T20:54:25.190 回答
4
example = [[x.replace('\r\n','') for x in i] for i in example]
于 2012-12-08T20:54:23.560 回答
2

如果您的列表比您给出的示例更复杂,例如,如果它们具有三层嵌套,则以下内容将遍历列表及其所有子列表,将 \r\n 替换为任何字符串中的空格它遇到了。

def replace_chars(s):
    return s.replace('\r\n', ' ')

def recursively_apply(l, f):
    for n, i in enumerate(l):
        if type(i) is list:
            l[n] = recursively_apply(l[n], f)
        elif type(i) is str:
            l[n] = f(i)
    return l
example = [[["dsfasdf", "another\r\ntest extra embedded"], 
         "ans a \r\n string here"],
        ['another \r\nlist'], "and \r\n another string"]
print recursively_apply(example, replace_chars)
于 2012-12-08T22:46:56.283 回答
1

下面的示例,在列表列表(子列表)之间进行迭代,以替换一个字符串、一个单词。

myoldlist=[['aa bbbbb'],['dd myword'],['aa myword']]
mynewlist=[]
for i in xrange(0,3,1):
    mynewlist.append([x.replace('myword', 'new_word') for x in myoldlist[i]])

print mynewlist
# ['aa bbbbb'],['dd new_word'],['aa new_word']
于 2016-04-29T12:53:09.243 回答