2016-05-04 3 views
2

さまざまなサイズのリストが多数含まれているPython配列を持っています。Python - 異なるサイズのリストを持つ配列を文字列に変換する

myArray = [('Hello my name is ', ('Bond, James', 'Bond. It is ', '16:40', ' now'), '!!!')] 

質問:文字列にすべての値を追加しますループ方式を作成せずに、怒鳴る出力を取得するための最良の方法(より最適化)とは何ですか?

私は次の出力見たい

"Hello my name is Bond, James Bond. It is 16:40 now!!!" 
+4

が –

+1

あなたが何を意味するのに参加、その後平らあなたは厳密に再帰的にこれを実行しますか、もしそうなら、なぜですか?あるいは、リストの理解も良いですか? –

+0

明示的にfor myArrayなどを作成せずに...より簡単な方法があるはずです: – waas1919

答えて

3

まず、あなたは「フラット」リストにネストされたリストを平坦化する必要があります。その代わりに、

def flatten(lst): 
    for x in lst: 
     if isinstance(x, str): 
      yield x 
     else: 
      for y in flatten(x): 
       yield y 

ところで、またcompiler.astモジュールでこの機能があるように思わあなたは可能性があり:あなたのリストは、文字列や他のリスト(またはタプル)のいずれかが含まれていると仮定すると、次のような機能を使用することができますその関数をインポートして使用するだけです。しかし、このモジュールは廃止され、リストが平坦化された後、

from compiler.ast import flatten 

いずれかの方法ではPython 3で削除されました、あなただけの1つの文字列にセグメントに参加する必要があります。

>>> list(flatten(myArray)) 
['Hello my name is ', 'Bond, James', 'Bond. It is ', '16:40', ' now', '!!!'] 
>>> ''.join(flatten(myArray)) 
'Hello my name is Bond, JamesBond. It is 16:40 now!!!' 
+0

これは私が必要なものです有用な答えを見つけませんでした:) – waas1919

1

あなたは正規表現(のpython 2.7)を使用することができます:

はでこれを試してみてください

import re 
myArray = [('Hello my name is ', ('Bond, James', 'Bond. It is ', '16:40', ' now'), '!!!')] 
print re.sub("(?:^|')[^']+(?:'|$)", '',str(myArray)) 

[Output] 

Hello my name is Bond, JamesBond. It is 16:40 now!!! 

UPDATEをMyArrayという= [(。これで 'ウォン\' トンの仕事 ')] - tobias_k 7時間前

import re 
p = r"(?:^|(?<!\\)')[^'\"\\]+(?:'|$)|(?:^|\")[^\"]+(?:\"|$)" 

myArray = [('Hello my name is ', ('Bond, James', 'Bond. It is ', '16:40', ' now'), '!!!')] 
myArray2= [('Won\'t work with this.')] 

print (re.sub(p, '', str(myArray))) 
print (re.sub(p, '', str(myArray2))) 

[Output] 

Hello my name is Bond, JamesBond. It is 16:40 now!!! 
Won't work with this. 
+0

'myArray = [( 'ウォン\' t仕事これで。 ')]' –

+0

新しいパターンで更新されました。 – Quinn

1

A mapは、それはかなり簡潔になります:

def flatten(arr): 
    if type(arr) == str: 
     return arr.strip() 
    else: 
     return " ".join(map(flatten, arr)) 

戻っ「こんにちは私の名前はボンド、ジェームス・ボンドです。 。それは今16時40分です!!!」たとえばあなたは、私が書いたような非常に包括的な再帰関数書くことができます

+1

なぜ 'if(arr)== str'ですか? –

+0

良い点。編集されました。 –

2

- ここ

In [1]: def solve(x): 
      if isinstance(x, str): 
       return x 
      return ''.join(solve(y) for y in x) 

In [2]: solve(myArray) 
Out[2]: 'Hello my name is Bond, JamesBond. It is 16:40 now!!!' 
2

は、それが平らになるよう加入バリエーションです:

例えば
def deepJoin(stuff,d = ' '): 
    if isinstance(stuff,str): 
     return stuff 
    else: 
     return d.join(deepJoin(x,d) for x in stuff) 

>>> deepJoin([('Hello my name is ', ('Bond, James', 'Bond. It is ', '16:40', ' now'), '!!!')]) 
'Hello my name is Bond, James Bond. It is 16:40 now !!!' 
2

別のオプションは、リストを平らにするために、リストの内包表記を使用することです:

bond_says = ["".join(item) for sublist in myArray for item in sublist] # list comprehension 
print(" ".join(bond_says)) 

出力:「?ループを作成せずに」

"Hello my name is Bond, JamesBond. It is 16:40 now !!!" 
関連する問題