

Pythonを使用しています。  
これらの二次元配列があったとします

[code]

    data=[[18,16,17], [75, 50, 80], [12, 13, 14], [8, 7, 9]]
    
[/code]

この二次元配列の中身を文字列型にして以下のように出力したいのですが、どのようにすればいいでしょうか。

[code]

    data=[['18','16','17'], ['75','50','80'], ['12','13','14'], ['8','7','9']]
    
[/code]

試したこととしては、

[code]

    data = list(map(str,data))
    print(data)
    
[/code]

このようにすると出力結果が以下のようになってしまいます。

[code]

    ['[18, 16, 17]', '[7, 5, 8]', '[12, 12, 14]', '[8, 7, 9]']
    
[/code]


CC BY-SA 4.0
2022-07-28T10:01:20.140
90255
2023-11-20T07:10:46.283
2022-07-28T14:39:54.160
question
python
二次元配列の中を文字列型にしたい


承認マークは付いていませんが、こちらの記事が応用できるでしょう。  
[convert element of 2D list into string
python](https://stackoverflow.com/q/35726627/9014308)  
(ただしこの記事は後に`for`ループと`join`で文字列化処理することが前提で作られています)

それを適用するとこうなります。  
2次元リストをそのまま`map()`に渡すから質問のようになってしまうのであって、いったん1次元リストに分解してから適用し、2次元に戻せば良いと思われます。

[code]

    data=[[18,16,17], [75, 50, 80], [12, 13, 14], [8, 7, 9]]
    
    data = [list(map(str,l)) for l in data]
    print(data)
    
[/code]

* * *

上記紹介記事の動作が微妙だったのはPython 2.x系の記述だったからのようですね。  
こちらの記事(質問とは逆にintに変換するもの)でPython 3.x系と併せて解説されていました。  
[Python: One-liner to perform an operation upon elements in a 2d array (list
of lists)?](https://stackoverflow.com/q/6381638/9014308)

ちなみにこちらの記事では`list()`と`map()`を組み合わせるよりも2重にネストされたリスト内包表記にした方が良いと書かれていました。  
こんな感じですね。

[code]

    data=[[18,16,17], [75, 50, 80], [12, 13, 14], [8, 7, 9]]
    
    data = [[str(e) for e in l] for l in data]
    print(data)
    
[/code]

何故か探ってみるとこんな記事があって、結果としてリストが欲しい場合はネストされたリスト内包表記にした方が少し速くなるようです。  
[Python の map
とfor内包表記(リスト内包表記)は結局どっちが速い？](https://blog.utgw.net/entry/2017/03/09/154314)


CC BY-SA 4.0
2022-07-28T10:31:36.973
90257
2022-07-28T15:10:40.737
2022-07-28T15:10:40.737
26370
26370
90255
answer


リスト内リストを扱うので 少し複雑になるかもだけど, 以下のように記述可能です  
速度計測してみたけど, ほとんど差はないようで, また Pythonバージョンによっても変化するかもしれません  
(計測は colabで行った)

[code]

    print([list(map(str, lst))for lst in data])
    # 2.5 µs ± 81.2 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
    
    print([[str(e)for e in lst]for lst in data])
    # 2.86 µs ± 58.8 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
    
    print([[f'{e}'for e in lst]for lst in data])
    # 2.32 µs ± 55.6 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
    
[/code]

また, リスト内リストの項目数が(今回のように)すべて同じなら NumPyでも可能  
(数値演算であれば NumPyは高速動作が期待できるけど, 文字列変換だけでは速度出ない模様)

[code]

    import numpy as np
    
    print(np.array(data).astype('unicode').tolist())
    #10.8 µs ± 90.5 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
    
[/code]


CC BY-SA 4.0
2023-11-20T07:10:46.283
96849
2023-11-20T07:10:46.283
43025
90255
answer