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]

またはラムダ関数でさえ

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

リストが例として示したものよりも複雑になる場合、たとえば、3 層のネストがある場合、次のようにリストとそのすべてのサブリストを調べて、任意の文字列の \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 に答える