2017-06-09 3 views
1

私は、リストjson_dataを持っている:リスト要素を区切り記号で分割する| 『暗黙的をstrするオブジェクトのリスト」を変換することはできません』というエラー(パイソン)

> print(json_data) 
> ['abc', 'bcd/chg', 'sdf', 'bvd', 'wer/ewe', 'sbc & osc'] 

私は「/」でそれらの要素を分割する必要があり、「&」または「と」 2つの異なる要素に分割する。私は次のようになります探しています結果:

>['abc', 'bcd', 'chg', 'sdf', 'bvd', 'wer', 'ewe', 'sbc' , 'osc'] 

コードは次のとおりです。

それを実行しているとき、私はエラーを取得しています
separators = ['/', 'and', '&'] 

titles = [] 
for i in json_data: 
    titles.extend([t.strip() for t in i.split(separators) 
        if i.strip() != '']) 

--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-15-d0db85078f05> in <module>() 
     5 titles = [] 
     6 for i in json_data: 
----> 7  titles.extend([t.strip() for t in i.split(separators) 
     8     if i.strip() != '']) 

TypeError: Can't convert 'list' object to str implicitly 

どのようにこれをすることができ一定?

答えて

1

正規表現はあなたの友達です:

>>> import re 
>>> pat = re.compile("[/&]|and") 
>>> json_data = ['abc', 'bcd/chg', 'sdf', 'bvd', 'wer/ewe', 'sbc & osc'] 
>>> titles = [] 
>>> for i in json_data: 
... titles.extend([x.strip() for x in pat.split(i)]) 
... 
>>> titles 
['abc', 'bcd', 'chg', 'sdf', 'bvd', 'wer', 'ewe', 'sbc', 'osc'] 

このラインノイズ:re.compile("[/&]|and")は「[/&]またはワード'and'のいずれかにマッチする正規表現を作成」を意味します。 [/&]は、もちろん/または&と一致します。 これを手に入れて、pat.split(i)は、文字列ipatに一致するものに分割するだけです。

遅く編集: もちろん、正規表現を少し複雑にすることでstrip()ステップをスキップできます。もし正規表現 "\ s [/ &] \ s | \ sand \ s"を持っていれば、基本的にマッチした要素の前後の空白にマッチします。

>>> pat = re.compile("\s[/&]\s|\sand\s") 
>>> pat.split("beans and rice and sandwiches") 
['beans', 'rice', 'sandwiches'] 
>>> 

これは簡単になります。これは、このパターンの分割が余分な空白を削除し、それが私たちのデータに表示されるように起こるべき加えて、それは、「サンドイッチ」のような単語の途中で分割から私たちを防ぐことを意味しリストの構築。スプリットの結果から空白を取り除く必要がなくなったため、私たちは何らかのループを余儀なくされました。新しいパターンを考えると、我々はそれをこのように書くことができます。

>>> titles = [] 
>>> for i in json_data: 
... titles.extend(pat.split(i)) 
... 
2

私は理解はPythonが区切り文字のリストが自動的に別離を持っていない

[t.strip() for separator in separators for t in i.split(separator) if i.strip() != ''] 

であるあなたがあなたのリストで探しているものと信じています。

+0

働いたこと、しかし、二回自分自身をコピーした要素のほとんどは、そう私のリストには、大きな3倍(51212の要素対174116)です。なぜそれが起こったのですか? –

+0

@FeyziBagirovこのリストを設定してからリストに戻します。これは重複を削除します – Uriel

+0

'i'はリストcompの過程で変更されないので、' i.strip() 'はコンプ –

2

問題がsplitへの呼び出しがによってiを分割する文字列を期待しますが、文字列のリストを取得しているi.split(separators)で発生します。 別のforループを使用してセパレータを反復処理して、それによってiを分割することもできます。

を編集すると、@ Urielの答えを見ているほうがよいです。それはもっとPythonの方法です。

0
json_data = ["abc", "bcd/chg", "sdf", "bvd", "wer/ewe", "sbc & osc"] 
separators = ['/', '&', 'and'] 
title = [] 

for i in json_data: 
    k = 0 
    while k < len(separators): 
     if separators[k] in i: 
      t = i.split(separators[k]) 
      title.extend(t) 
      break 
     else: 
      k += 1 
     if k == 3: 
      title.append(i) 
print(title) 
+1

コードの字下げが正しくない – kuro

+0

@kuroそれを指摘してくれてありがとう。電話から掲示、インデントが混ざりました。 すべてが今修正されました。 –

+0

@nitin_cherianすべての追加情報ありがとうございます。 私は確かにそれを調べます。 Pythonには5ヶ月しかありませんが、私はまだ多くのことを学ぶ必要があります。 –

関連する問題