Java vs Python - 構文の違い選手権(超不完全版)

2018.05.26 追記: ソースコードのコメント中にある〝Python〟の綴りに誤りがあるとのご指摘を頂いたので訂正しました。

というわけで、春の Python まつりやります。やりません。

かく言う僕も、お仕事では C#Java ばかり触っているせいで、ごくたまに Python を触ろうとすると構文をド忘れしていることが非常に多いものです。

Pythonではどう書けばいいんだっけ?」という思い出し時間は人生の無駄だと気づいたので、自分用メモとして JavaPython の構文の対比を適当にまとめておくことにしました。

本日のメニューは以下の通りです。動作確認を行った処理系のバージョンは、それぞれ Java 1.8 / Python 3.6 です。

JavaのリストとPythonのリスト

素数の取得

JavaはCollection#sizeメソッド
// Java
List<String> members = new ArrayList<>(Arrays.asList("たかし", "斉藤さん"));
System.out.println(members.size());    // => 2
Pythonはlen関数
# Python
members = ["たかし", "斉藤さん"]
print (len(members))    # => 2

要素の包含チェック

JavaはCollection#containsメソッド
// Java
List<String> members = new ArrayList<>(Arrays.asList("たかし", "斉藤さん"));
System.out.println(members.contains("たかし"));    // => true
Pythonは in 演算子
# Python
members = ["たかし", "斉藤さん"]
print ("たかし" in members)    # => True

文字列要素の連結

どちらもjoinメソッドを使用するが、構文が異なる。

JavaはString#joinメソッド
// Java
List<String> members = new ArrayList<>(Arrays.asList("たかし", "斉藤さん"));
System.out.println(String.join(",", members));    // たかし,斉藤さん
Pythonもjoinメソッド
# Python
members = ["たかし", "斉藤さん"]
print (",".join(members))    # => たかし,斉藤さん

JavaのStreamとPythonの内包表記

0〜4の整数でリストを初期化する

JavaのStream
// Java
List<Integer> numbers = IntStream.range(0, 5).boxed().collect(Collectors.toList());
System.out.println(numbers);    // => [0, 1, 2, 3, 4]
Pythonの内包表記
# Python
numbers = [num for num in range(0, 5)]
print (numbers) # => [0, 1, 2, 3, 4]

1〜9の奇数値でリストを初期化する

JavaのStream
// Java
List<Integer> numbers = IntStream.range(0, 10)
    .filter(n -> n % 2 != 0)
    .boxed()
    .collect(Collectors.toList());

System.out.println(numbers);    // => [1, 3, 5, 7, 9]
Pythonの内包表記
# Python
numbers = [num for num in range(0, 10) if num % 2 != 0]
print (numbers) # => [1, 3, 5, 7, 9]

Java連想配列(Map)とPython連想配列(辞書)

初期化構文

Java連想配列(Map)
// Java
Map<String, String> map = new HashMap<String, String>() {
    {
        put("001", "ピカチュウ");
        put("002", "カイリュー");
    }
};

map.forEach((k, v) -> System.out.println(k + ":" + v));
// => 001:ピカチュウ
// => 002:カイリュー
Python連想配列(辞書)
# Python
myMap = {
       "001" : "ピカチュウ",
       "002" : "カイリュー"
       }

print(myMap) #=> {'001': 'ピカチュウ', '002': 'カイリュー'}

Javaの集合(Set)とPythonの集合(set)

初期化構文

Javaその1 (リストから集合を作る例)
// Java
Set<String> set = new HashSet<>(Arrays.asList("a", "b", "c", "a"));
System.out.println(set);    // => [a, b, c]
Javaその2 (Streamから集合を作る例)
// Java
Set<String> set = Stream.of("a", "b", "c", "a").collect(Collectors.toSet());
System.out.println(set);    // => [a, b, c]
Pythonその1(リストから集合を作る例)
# Python
mySet = set(["a", "b", "c", "a"])
print(mySet)    #=> {'a', 'b', 'c'}
Pythonその2(専用の初期化構文を使用する例)
# Python
mySet = {"a", "b", "c", "a"}
print(mySet)    #=> {'a', 'b', 'c'}

和集合

JavaはSet#addAllメソッド
// Java
Set<String> a = new HashSet<>(Arrays.asList("0", "1", "2", "3", "4"));
Set<String> b = new HashSet<>(Arrays.asList("0", "2", "4", "6", "8"));

Set<String> union = new HashSet<>(a);
union.addAll(b);

System.out.println(union);  // => [0, 1, 2, 3, 4, 6, 8]
Pythonは | 演算子
# Python
a = {"0", "1", "2", "3", "4"}
b = {"0", "2", "4", "6", "8"}

print(a | b)    # => {'0', '1', '2', '3', '4', '6', '8'}

積集合

JavaはSet#retainAllメソッド
// Java
Set<String> a = new HashSet<>(Arrays.asList("0", "1", "2", "3", "4"));
Set<String> b = new HashSet<>(Arrays.asList("0", "2", "4", "6", "8"));

Set<String> intersection = new HashSet<>(a);
intersection.retainAll(b);

System.out.println(intersection);  // => [0, 2, 4]
Pythonは & 演算子
# Python
a = {"0", "1", "2", "3", "4"}
b = {"0", "2", "4", "6", "8"}

print(a & b)    # => {'0', '2', '4'}

差集合

JavaはSet#removeAllメソッド
// Java
Set<String> a = new HashSet<>(Arrays.asList("0", "1", "2", "3", "4"));
Set<String> b = new HashSet<>(Arrays.asList("0", "2", "4", "6", "8"));

Set<String> difference = new HashSet<>(a);
difference.removeAll(b);

System.out.println(difference);  // => [1, 3]
Pythonは - 演算子
# Python
a = {"0", "1", "2", "3", "4"}
b = {"0", "2", "4", "6", "8"}

print(a - b)    # => {'1', '3'}

つかれたので今日はこれでおしまい。

Copyright (c) 2012 @tercel_s, @iTercel, @pi_cro_s.