KHCの

KHC( https://twitter.com/we_can_panic )が140字を超えるツイートをするところ

PythonのこれってNimでどう書くの

個人的に使う表現ランキング。
Nimはスクリプト言語じゃないから本来の書き方から離れがちではあるけど。
やるぞっ。

1. CSVの読み込み(簡易)

Python

csv_data = [i.strip().split(",") for i in open("hoge.csv").readlines()]

Nim

import strutils, sequtils
var csv_data = readFile("hoge.csv").split("\n").mapIt(it.strip.split(","))

2. 転置

Python

data = [[1,2,3], [4,5,6]]
data2 = [[j[i] for j in data] for i in range(len(i))]

Nim

import sequtils

var
  data = [[1,2,3], [4,5,6]]
  data2 = block:
            var tmpdata: seq[seq[int]]
            for i in 0..<data.len:
              tmpdata.add(data.mapIt(it[i]))
            tmpdata

3. CSV形式→JSON形式

Python

list_data = [
  ["1", "2", "3", "4"], # <- csv header
  ["A", "B", "C", "D"],
  ["E", "F", "G", "H"]
]
dict_data = [{key:vals[i] for i, key in enumerate(list_data[0])} for vals in list_data[1:]]
"""
[
  {'1': 'A', '2': 'B', '3': 'C', '4': 'D'},
  {'1': 'E', '2': 'F', '3': 'G', '4': 'H'}
]
"""

Nim

import json, sequtils, tables

var
  list_data = [
    ["1", "2", "3", "4"], # <- csv header
    ["A", "B", "C", "D"],
    ["E", "F", "G", "H"]
  ]
  # 発想はPythonと同じで、list_dataのvalue部分をイテレートしてkey部分の要素と1:1でdictを作っている
  # seq[(string, string)]だと%でJsonに変換できなくて間にtoTableを嚙ましてある
  dict_data = %list_data[1..^1].mapIt(% zip(list_data[0], it).toTable)

  # さすがに分かりづらい。
  # 普通に書くならこうかも
  dict_data = block:
                var
                  keys = list_data[0]
                  tmpdata = %[]
                for vals in list_data[1..^1]:
                  tmpdata.add( % zip(keys, vals).toTable)
                tmpdata

4. Jsonの配列オブジェクトから任意の値を削除

Python

dict_data = [
  {"id": 1, "name": "Yulia"},
  {"id": 2, "name": "Raoh"},
  {"id": 3, "name": "Toki"},
]
# lambdaよりもこっちが書きやすいと思う
dict_data_2 = [i for i in dict_data if i["id"]!=2]

Nim

import json, sequtils

var
  dict_data = %* [
    {"id": 1, "name": "Yulia"},
    {"id": 2, "name": "Raoh"},
    {"id": 3, "name": "Toki"},
  ]
  dict_data_2 = %* dict_data.getElems.filterIt(it["id"].getInt!=2)

5. Jsonファイルの保存

Python

import json

dict_data = [
  {"id": 1, "name": "Yulia"},
  {"id": 2, "name": "Raoh"},
  {"id": 3, "name": "Toki"},
]

json.dump(dict_data, open("hoge.json", "w"), indent=2)

Nim

import json

dict_data = %* [
  {"id": 1, "name": "Yulia"},
  {"id": 2, "name": "Raoh"},
  {"id": 3, "name": "Toki"},
]

writeFile("hoge.json", dict_data.pretty)

6. CSVの読み込み(commaエスケープなど)

Python

import csv
csv_data = list(csv.reader(open("hoge.csv")))

Nim

import parsecsv, sequtils
var
  csv_data =  block:
                var
                  tmpdata: seq[seq[string]]
                  x: CsvParser
                defer: x.close()
                x.open("hoge.csv")
                while x.readRow():
                  tmpdata.add(x.row)
                tmpdata

Nimは(Pythonと張り合うために)シェル芸的な書き方が多かったけど実際のコーディングでは適宜blockや関数に落とし込んで実装することが多いかも。
blockが便利すぎる。手続き型みたいに文字空間を汚さないし、関数みたいに別の箇所を参照しなくて良いし。

読む難易度はPythonの内包表記と似たり寄ったりなはず(どちらかが読みにくいと感じたなら、それは他方との習熟度の違いの影響だと思う)