2017-02-07 5 views
-1

私は、文字列のように動作していると想定している要素(「トークン」)のリストを持っています。私はアンダースコアをアンダースコアで置き換え、アンダースコアをスペースで置き換えます。それがここで何と基本的に同じだリストを返すPython結合メソッド?

for e in tokens: 
     if '_' in e: 
      cmpd = list(e) 
      cmpd[e.find('_')] = ' ' 
      ''.join(cmpd) 
      new_tokens[index] = cmpd 

:私は、次のコードを持っている Change one character in a string in Python?

後、私は、スペースで区切られた各文章内のすべてのリスト要素を連結しようとしているが、私は取得します次のエラー:

TypeError: can only concatenate list (not "str") to list

そして私はecmpdをプリントアウトした場合、私はこの出力を得る:

e: my_string 

cmpd: ['m', 'y', ' ', 's', 't', 'r', 'i', 'n', 'g'] 

なぜcmpdはリストであり、文字列ではないのですか?

+0

アンダースコアを置き換えますか?それとも言葉全体? –

+3

おそらく 'string.replace( '_'、 '')' – MYGz

+2

'join()'はインラインではありません。 – MooingRawr

答えて

3

あなたは=を使用してcmpd''.join(cmpd)を割り当てる必要があります。

cmpd=''.join(cmpd) 
+0

明らかに私は完全にそれを逃した...ありがとう! – eihe

0

あなたはこの行を取得するときcmpd = list(e) eは文字列であり、あなたがリストに変換され、これは、リスト内の各文字の項目になります

2
''.join(cmpd) 

この行は、文字列に変換しcmpdは、その後、離れてその文字列をスローします。そこに多くの問題がここにある

cmpd = ''.join(cmpd) 
2

:あなたは、文字列を維持する必要があり、あなたが定義されていないindexを使用

  • .joinない仕事インプレースを行います。
  • トークンに複数のアンダースコアが含まれている場合、1つだけが置換されます。
  • トークンにアンダースコアが含まれていない場合は追加されません。そして
  • ...についてどう

new_tokens = [token.replace('_',' ') for token in tokens] 

これは、ループ全体を置き換えると、それは非常に明確にあなたがスペースでアンダースコアを交換することになります。

+0

replace関数は知っておいてよかったです、ありがとう!私は複数のアンダースコアを持つ言葉を持っていないので、複数のアンダースコアを見つけても気にしませんでした。この場合、 'cmpd = e.replace( '_'、 '')'と書くことができます。これは確かにきれいです!しかし、私は異なる場合に複数の節があるので、forループは必要です。 – eihe

+1

@eihe:ええ、ループがもっと複​​雑な場合は、実際に 'cmpd = ...'と書くことができます。しかし、単純な問題リストの理解は、より早くより洗練されているので、行く方法です。 –

1
no_underscores = [x.replace('_', ' ') for x in tokens] 
print(' '.join(no_underscores)) 

だから何が起こることは、古いものの要素が含まれていますが、アンダースコアなし(あなたも前のものを上書きすることができます)あなたは、新しいリストを作成することです(.replaceは、あなたが探している文字列であっても動作しますいない)。 2行目では、新しいリストのすべての要素は、joinの間にスペースを入れて編集されています。

あなたは上記と快適に感じる場合は、そうであっても同じようにそれらを組み合わせることができます余分なリストを作成しないという利点があり

print(' '.join(x.replace('_', ' ') for x in tokens)) 

+0

ここでスペースに参加できますか? –

+0

@WillemVanOnsem "*文中のすべてのリスト要素を連結し、それぞれスペースで区切ります*。"私はそれを間違って解釈しているのですか? –

+0

ああ、結合はトークンではなく、文字にあります。それを逃した。 –

関連する問題