2017-02-07 7 views
0

ネストされたリストを行ごとに出力するには、forループとネストされたリストの各intをmap()でstrにマッピングする.join()を使用します。forループなしで行ごとにネストされたリストを出力する

例:

>>> ys = [[1, 2, 3], [4, 5, 6], [7, 8, 9, 10]] 
>>> for xs in ys: 
...  print(" ".join(map(str, xs))) 
... 
1 2 3 
4 5 6 
7 8 9 10 

しかし、私は、内側のリストの任意の長さをサポートすることができますforループせずに、再びこれを行う方法を把握しようとしています。助言がありますか?

+1

いずれかの特定の理由がありますが、forループを回避している

あなたにも、マップの呼び出しを避けるために、同じ方法を使用することができます? – Carcigenicate

+0

本当は...私はちょうど異なるアプローチで問題を解決したいと思っていました。 – pewnienewbie

+0

リスト内のリストが深くなると言っていますか?あなたはリスト内のリスト内にリストを持つことができますか? – kbunarjo

答えて

3

深さが知られており、固定されているので、あなたは、少なくとも(forループを伴うだろう)理解を避けるためにlambdaを使用してワンライナーで2つのmap文、

ys = [[1, 2, 3], [4, 5, 6], [7, 8, 9, 10]] 
print("\n".join(map(lambda xs : " ".join(map(str, xs)),ys))) 

なしforループ、巣をすることができます表示されません。

パフォーマンスの観点からは、mapはループを実行しますが、例外なくコンパイルされるため、高速です。一方、join(ないmaplistを返すのPython 2で)そうlistが、とにかく反復可能なの外に作成された入力の大きさを知る必要があり、かつjoin + リスト理解は、より高速です。言い換えれば、timeitを使用して、あなたのコンテキストで最も速いバリアントを決定してください。

+0

ありがとう! 2つのマップステートメントを使用すると意味があります。私はその方法を考えなかった! – pewnienewbie

+0

'map'とfor-loopまたは' map'と 'comprehension'を考えるときのパフォーマンス上の考慮点は単純ではありません。参照:http://stackoverflow.com/a/39046254/5014455組み込み関数は一般的に 'map'を使ってより速くマップされますが、これは同等のリスト内包表記に比べて複雑ですが、ユーザー定義関数は反対のパターンを示します(comprehensionsは 'map'よりも速くマップされます)。 –

+0

@ juanpa.arrivillaga 'timeit'は唯一の裁判官になります:) –

1
ys = [[1, 2, 3], [4, 5, 6], [7, 8, 9, 10]] 
print "\n".join([" ".join(map(str,subList)) for subList in ys]) 

コードの説明:

[" ".join(map(str,subList)) for subList in ys]

をこれはスペースと組み合わせて、各リストの各値を文字列のリストを作成しました。

["1 2 3", "4 5 6", "7 8 9 10"]

"\n".join()その後かなり自己explantoryです。

EDIT:

lambda代わりのforを使用することを更新しました。リストの任意の長さ/深さのための再帰関数として

ys = [[1, 2, 3], [4, 5, 6], [7, 8, 9, 10]] 
print "\n".join(map(lambda x: " ".join(map(str,x)),ys)) 
+1

あなたの答えに'のための 'があります... –

+0

ええそれ以外の場合は意味をなさないでしょう。しかし、ありがとう!興味深い解決策。 – pewnienewbie

+0

@pewnienewbie、私は 'for'の代わりに' lambda'を使うようにこれを更新しました。これが大丈夫かどうかは分かりません。 – Michael

1

:他の2つの答えが深さ> 2.この意志のために動作しません注目に値する

def recursive_print_list(param): 
    while len(param) > 0: 
     if isinstance(param[0], list): 
      recursive_print_list(param[0]) 
      print("") 
      param = param[1:] 
     else: 
      print(param[0], '', end='') 
      param = param[1:] 

。また、 print()の暗黙的な文字列への変換に依存しているため、すべての要素が print(element)である限り、任意の混合入力で動作します。


オリジナル回答:

xs = ys[:] # copy the original list, as this method is destructive 
while True: 
    try: 
     print " ".join(map(str, xs[0])) 
     xs = xs[1:] 
    except IndexError: 
     break 

は、int型の任意のネストされたリストのために動作します。 のPython 3:

xs = ys[:] 
while True: 
    if len(xs) == 0: 
     break 
    subl = xs[0][:] 
    while True: 
     try: 
      print(subl[0], ' ', sep='', end='') 
      subl = subl[1:] 
     except IndexError: 
      print("") 
      break 
    xs = xs[1:] 

のPython 2.7:

xs = ys[:] 
while True: 
    if len(xs) == 0: 
     break 
    subl = xs[0][:] 
    while True: 
     try: 
      print subl[0], 
      subl = subl[1:] 
     except IndexError: 
      print "" 
      break 
    xs = xs[1:] 
関連する問題