java to python

  • Cがエラーを吐いたとき

僕が研究で使用しているシミュレーションのプログラムはCで記述されている。このプログラムでは、グローバル変数をマクロ(#define)で記述しています。こうしておいてパラメータの部分だけヘッダーファイルにまとめてから、python
1.ヘッダーファイルのマクロを書き換える
2.コンパイル&実行
ってなことをやっているんですが、たまにエラーを吐くことがあるんですね。書き換え実行のスパンが短すぎるのだろうなと考えてsleepコマンドをかませるというのもやってみたのですが、効果はまちまち。コンパイルエラーしたら、マクロを書き換える前のパラメータでファイルが実行されているため、同じデータが記述されてしまいます。

  • javaのコードを久しぶりに拝見

上記のような「データの中にまれに、同じ情報(ゴミ)が入ってる。除くコードを書いてみよう」ってことで、まずは、隣の要素と比較して出力するようなものを自分で書かずに適当にググる。ググったらyahoo!知恵袋で紹介されていた。なんだあるじゃないかってことで、javaのコードを見て、pythonに書き直してみました。

import java.util.ArrayList;
import java.util.List;
 
public class Duplicate {
  public static void main(String[] args) {
    String[] ss = {"b", "b", "a", "a", "c", "c"};
    List<String> ls = new ArrayList<String>();
    for (int i = 0; i < ss.length; i++)
      ls.add(ss[i]);
    String prev = ls.iterator().next();
    List<String> ret = new ArrayList<String>();
    ret.add(prev);
    for (String e: ls) {
      if (!prev.equals(e)) ret.add(e);
      prev = e;
    }
    System.out.println(ret);
  }
}

長いですね。てか、ls.iterator().next()とかif (!prev.equals(e))の辺りはjavaってこういうメソッド用意されてるんだなと。以下、書き直したpythonのコードです。

ls = ["b", "b", "a", "a", "c", "c"]
prev = next(iter(ls))
ret = [prev]
for e in ls:
    if prev != e:
        ret.append(e)
    prev = e
print(ret)

いや、まてよ。next(iter(ls))の下りってls[0]でよくね?っと思って書き直した。

ls = ["b", "b", "a", "a", "c", "c"]
prev = ls[0]
ret = [prev]
for e in ls:
    if prev != e:
        ret.append(e)
    prev = e
print(ret)

厳つかったjavaのコードだったが、大したことしてないな、これ。