[C++] 81 連続整数の文字列配列作成 iota関数

[M1 Mac, Big Sur 11.6.7, clang 13.0.0, NO IDE]

C++11から標準ライブラリに採用のiota関数を使って連続整数の文字列配列を作成しました。

GUIアプリで整数を表示させる際にこのような配列が必要になったりします。

なおiota関数を使った直後の変数 testはintの配列なので、これはこれで使い道はあります。

最近は変数に型を付けないと物足りなくなってきました。コードを量産するには型推論が便利でしょうが、趣味レベルで楽しむ分には型付けはあまり苦になりません。

C++のように確実に型付けするか、Pythonのようにいさぎよく何も書かないか、どちらもスタンスがハッキリしていて好みですね。

#include <iostream>
#include <numeric>
#include <array>

using std::cout;

// 11から連続整数10個の文字列リスト作成
int main(int argc, char **argv) {
	int start_num = 11; // 開始数
	const unsigned long nums = 10;  // 個数

	int test[nums];
	std::iota(test, test + nums, start_num);

	// 以下でも可能
	// std::array<int, nums> test;
	// std::iota(test.begin(), test.end(), start_num);

	int i = 0;
	for (int num : test){
		if (i == 0){
			cout << "{\"" << num << "\", " ;
		} else if (i > 0 && i < (nums -1)){
			cout << "\"" << num << "\", " ;
		} else {
			cout << "\"" << num << "\"}" ;
		}

		i++;
	}
}
--------------------------------------------------
出力
--------------------------------------------------
{"11", "12", "13", "14", "15", "16", "17", "18", "19", "20"}

[Python]335 重複する画像を削除する 改良版

[M1 Mac, Big Sur 11.6.7, Python 3.10.4]

前回の改良版です。

前回のスクリプトでは、コピーした画像が3枚ある場合、三つ巴になって3枚全て削除対象になる可能性があるため、st_birthtime(元ファイル作成時刻)が同じケースではst_ctime(コピーした時刻)が古い方を削除対象にするようにしました。これで最も新しいコピー画像が残ります。

最初からst_ctimeを判断基準にするとスクリプトがよりシンプルになります。

このスクリプトは先日製作したRustアプリにツールとして登録しました。

import os,glob,itertools,cv2
import numpy as np

path_list = glob.glob("/Desktop/temp/*.png")

delete_list = []
for pair in itertools.combinations(path_list, 2):
    path_pair = list(pair)
    
    image1 = cv2.imread(path_pair[0])
    stat1 = os.stat(path_pair[0])
    btime1 = stat1.st_birthtime
    ctime1 = stat1.st_ctime
    
    image2 = cv2.imread(path_pair[1])
    stat2 = os.stat(path_pair[1])
    btime2 = stat2.st_birthtime
    ctime2 = stat2.st_ctime  

    result_compare = np.array_equal(image1, image2)
        
    if result_compare == True:
        if btime1 > btime2:
            delete_list.append(path_pair[1])
        elif btime1 < btime2:
            delete_list.append(path_pair[0])
        else:
            if ctime1 > ctime2:
                delete_list.append(path_pair[1])
            else:
                delete_list.append(path_pair[0])
                
print(delete_list)

for file in delete_list:
    try:
        os.remove(file)
    except FileNotFoundError:
        pass

[Python]334 重複する画像を削除する

[M1 Mac, Big Sur 11.6.7, Python 3.10.4]

スクリーンショットを何枚も撮影していると全く同じ画像が混ざることがあります。

OpenCVを使って同一ディレクトリ内にある画像同士を比較し内容が同じ場合は作成日時が古い方を削除するスクリプトを作成しました。

ファイルパスのリストを作成し、要素数2の組み合わせについて画像を比較、同じであれば作成日時の古い方を削除リストに追加。全ての判定が終わってからまとめて削除します。同じ画像が3枚以上あっても対応できるようにしました。

前にも書きましたが作成日時 st_birthtimeはMacOS限定です。Windowsの場合はst_ctimeになります。

import os,glob,itertools,cv2
import numpy as np

path_list = glob.glob("/Desktop/temp/*.png")

delete_list = []
for pair in itertools.combinations(path_list, 2):
    path_pair = list(pair)
    
    image1 = cv2.imread(path_pair[0])
    stat1 = os.stat(path_pair[0])
    btime1 = stat1.st_birthtime
    
    image2 = cv2.imread(path_pair[1])
    stat2 = os.stat(path_pair[1])
    btime2 = stat2.st_birthtime    

    result_compare = np.array_equal(image1, image2)
        
    if result_compare == True:
        if btime1 > btime2:
            delete_list.append(path_pair[1])
        else:
            delete_list.append(path_pair[0])
                
print(delete_list)

for file in delete_list:
    try:
        os.remove(file)
    except FileNotFoundError:
        pass

220712追記:
スクリプトの改良版を作成しました。