Python3関連のことを調べてみた

Python3関連のことを調べてみた

Elasticsearch version8 におけるAPIの認証の通し方

# はじめに
Elasticsearchがversion8になってからcurlコマンドが実行できなくなったことはありませんか?
“`shell
$ curl -s http://localhost:9200/
“`
実行結果
“`json
{
“error”:{
“root_cause”:[
{
“type”:”security_exception”,
“reason”:”missing authentication credentials for REST request [/]”,
“header”:{
“WWW-Authenticate”:[
“Basic realm=\”security\” charset=\”UTF-8\””,
“ApiKey”
]
}
}
],
“t

元記事を表示

【Python】circular importエラーをシンプルに解説

Qiitaで検索しても手早くcircular importを解決する記事が見当たらず、初心者に不親切そうだと見受けられたので、手早く解説する記事をここに置きます。

## Circular Importとは?
:::note
日本語では **循環参照** というキーワードに当たります。
これで検索するといっぱい日本語の情報にヒットするでしょう。
:::

今回のバグを言葉で表すと、 **モジュールが巡り巡って自分を`import`するとエラーになる** ことです。

### 単純な例(2モジュール)
“`python:A.py
from B import f_b

def f_a():
f_b()
“`

“`python:B.py
from A import f_a

def f_b():
f_a()
“`

これは明確に`A→B`と`B→A`の依存関係がありますね。

:::note
慣例通り、`X→Y`は「XがYに依存している」という意味で用いています。
:::

例えば`A.py`を実行したり、他のモジュールから`import A`したりすると、`cir

元記事を表示

文字列の配列 (paizaランク C 相当)

https://paiza.jp/works/mondai/data_structure/data_structure__string_boss

>縦 H マス、横 W マスの H × W マスからなる迷路 S があります。上から i 行目、左から j 列目のマス は S_ij とあらわされ、 S_ij が「#」のとき壁であり、「.」のとき道です。整数 r、c が与えられるので、S_rc が壁かどうか判定してください。

一風変わった問題。

おそらくループで縦ヨコのマスを作ればいいんだとは思うが、
とりあえず1行目の各変数を格納しておいて、次の2行目がどうなるのか見てみた。

“`py
H,W,r,c = map(int,input().split())
print(input())

“`

“`
..#.
“`
なんとー。半スペで区切られていないやつだった。なるほど。
ほんなら、1文字ずつスライスして配列にいれればいいんかな?
やってみましょう。
ちなみにやり方は知らんが、phpで同じことをやったことがあるので
pythonでも同じことができるのか調べてみた。

ありま

元記事を表示

【Python】同じディレクトリの__init__を使うとcircular importになる

## 事象
同じディレクトリDに
“`
D
┠ __init__.py
┠ M1.py
┗ M2.py
“`
の3ファイルがあるとしましょう。
それぞれが以下のスクリプト記述がされているとします。

“`python:__init__.py
from D.M1 import f1
from D.M2 import f2
“`

“`python:M1.py
from D import f2

def f1():
print(“f1”)
f2()
“`

“`python:M2.py
def f2():
print(“f2”)
“`

ここで、外から`D.M1`を`import`すると`circular import`エラーが発生します。

## 原因
`M1`と`M2`モジュールは、`M1→M2`の一方通行依存関係なので、機能的には循環参照にはなっていません。

しかし、
“`python:M1.py
from D import f2
“`
の部分で、`M1`は`__init__.py`を`import`しています。
そして、`__init_

元記事を表示

cifファイルをPOSCARファイルに一括変換(ログ)

# 目標設定
cif2cell[1]を使って,cifファイルをPOSCARファイルに一括変換する.

[1] https://github.com/torbjornbjorkman/cif2cell

## 流れ
1. cif2cellのインストール.
2. 各cifファイルが存在するディレクトリ階層に,cifファイル名と同じ名前のディレクトリを作成.
* mk_cif_num_name_dirs.py[2]
* 入力:cif/(というディレクトリ名のパス)
* 出力:なし
3. 2. で作成したディレクトリに,cif2cellを用いて作成したPOSCARファイルを保存.
* mk_poscar_by_c2c.py[2]
* 入力:cif/(というディレクトリ名のパス)
* 出力:POSCARファイル
* 出力先:各cifファイル名のついたディレクトリ

[2] https://github.com/k-morii

元記事を表示

動的配列 Python3編

https://paiza.jp/works/mondai/data_structure/data_structure__array_boss

>N 個の要素からなる数列 A が与えられます。数列 A に対し、次の 3 つの操作を行うプログラムを作成してください。

>・ push_back x : A の末尾に x を追加する
・ pop_back : A の末尾を削除する
・ print : A を半角スペース区切りで1行に出力する

>例えば、入力例 1 において、数列 A は最初「1 2 3」です。最初の操作は「push_back 10」なので、末尾に 10 を追加して「1 2 3 10」となります。 2 つ目の操作は「push_back 12」なので、「1 2 3 10 12」となります。 3 つ目の操作は「print」なので「1 2 3 10 12」を出力します。 4 つ目の操作は「pop_back」なので末尾の「12」を削除して、「1 2 3 10」となります。最後の操作は「print」なので「1 2 3 10」を出力します。

というなかなかややこしい問題。

元記事を表示

複数回のランダムアクセス Python3編

https://paiza.jp/works/mondai/data_structure/data_structure__array_step2

>要素数 N の数列 A と要素数 Q の数列 B が与えられます。 1 ≦ i ≦ Q の各 i について、i 行目に A の B_i 番目の値を出力してください。

という問題。
さっそく覚えた内包表記をつかってAとBの配列を作ってごにょごにょやる(言い方)

“`py
N = int(input())
A =[int(x) for x in input().split()]
Q = int(input())
B =[int(y) for y in input().split()]
for i in B:
print(A[i-1])
“`

Qをつかうならその次のfor文はこんな感じに。
わかりやすいのはどっちかな? 多分上?

“`py
for i in range(Q):
print(A[B[i]-1])
“`

内包表記を使うときれいに1行にまとまるね〜。

元記事を表示

ランダムアクセス Python3編

今日のお題はここから
https://paiza.jp/works/mondai/data_structure/data_structure__array_step1

> 要素数 N の数列 A と数値 M が与えられます。A の M 番目の値を出力してください。

今までの問題をやっていたら意外と!簡単にできてしまった。

“`py
N,M = map(int,input().split())
A = list(map(int,input().split()))
print(A[M-1])
“`
Aの配列に入れるところを、ループでやってみる
今までは、`arr= input().split()`と配列に入れていた部分を、
下のようにそのままループにしてしまえる。

“`py
A =[]
for x in input().split():
A.append(int(x))
“`
そしてこれはもっと簡単にできて

“`py
A = [int(x) for x in input().split()]
“`
こんな感じになる(なーんと!)
内包表記(ないほうひょうき)と

元記事を表示

N 行 M 列のデータの入力】行ごとに要素数の異なる整数列の入力 Python3編

今日の最後の問題
https://paiza.jp/works/mondai/stdin_primer/stdin_primer__matrix_data_boss

>1 行目に整数 N が与えられます。
>2 行目から (N + 1) 行目までの先頭に整数 M_i (1 ≦ i ≦ N) が与えられます。それに続いて >M_i 個の整数 a_1, …, a_{M_i} が与えられます。
>上から i 番目、左から j 番目の整数は a_{i,j} です。
>N 行の a_1, …, a_M をそのまま出力してください。

というもの。
以前の復習とちらっと新しい学習要素が。
どうしても次の要素からというのが見つからず。
じゃあ配列の要素を削除しちゃおう、ということで。
調べてきました。
配列の最初の要素を削除する、というもの。
`del tmp[0]`
でできる。
これを使って下記のようにした。

“`py
N = int(input())
arr = []
for i in range(N):
tmp = input().split(” “)
del t

元記事を表示

N 行 M 列の整数の入力 Python3編

前回と似たような課題
https://paiza.jp/works/mondai/stdin_primer/stdin_primer__matrix_data_step4

>1 行目で整数 N と整数 M が与えられます。
>2 行目以降で N 行 M 列の行列が与えられます。上から i 番目、左から j 番目の整数は >a_{i,j} です。
>N 行 M 列の行列をそのまま出力してください。

“`py
arr = list(map(int,input().split()))
N = arr[0]
M = arr[1]

arr = []
for i in range(N):
value = list(map(int,input().split(” “)))
arr.append(value)

for i in range(N):
print(*arr[i])

“`
内容としてはこれでOKなんだけど、
最初の部分はもっと簡単にできる方法があるそうだ。

“`py
N, M = map(int, input().split())
“`
なるほど〜

元記事を表示

3 行 3 列の整数の入力 Python3編

問題をいくつか飛ばしてこんな問題。
https://paiza.jp/works/mondai/stdin_primer/stdin_primer__matrix_data_step1

> 3 行 3 列の行列が与えられます。上から i 番目、左から j 番目の整数は a_{i,j} です。
> 3 行 3 列の行列をそのまま出力してください。

まあ何も考えんとやれば。。。
“`py
print(input())
print(input())
print(input())
“`
となるけどそんなわけもない。
二次元配列を入れる方法で考えていく

“`py
arr = []
for i in range(3):
value = list(map(int,input().split(” “)))
arr.append(value)

for i in range(3):
print(*arr[i])
“`
見慣れない方法だけど、
print() でリストを出力するときに、先頭に * をつけることで、リストの要素を半角スペースで区切った文字列を出力すること

元記事を表示

整数の組からの選択 Python3編

いくつか問題を飛ばして今回はこれ
https://paiza.jp/works/mondai/stdin_primer/stdin_primer__pair_data_step3

> 1 行目に整数 N が与えられます。
> 2 行目以降に、N 組の整数 a_i と b_i が N 行で与えられます。(1 ≦ i ≦ N)
> 8 組目の a_i と b_i を出力してください。

わたしはというと、とりあえず文字列のまま配列に入れて7番目のを出力という方法。
でも可読性は悪いなと感じている。
これはN組というのは次元を暗示しているので普通なら配列に入れてやらないといけないと思う。

“`py
N = int(input())
arr = []
for i in range(1,N+1):
arr.append(input())

print(arr[7])
“`
なので再度考える

“`py
N = int(input())
a = []
b = []
for i in range(N):
a_value, b_value = map(int,

元記事を表示

2 行目で与えられる N 個の文字列の入力 Python3編

次はこれ(例のごとく何題か飛ばしてます(実際はクリアしてますがQiitaで飛ばしているという意味)
https://paiza.jp/works/mondai/stdin_primer/stdin_primer__string_number_step2

1 行目に整数 N,2 行目に、N 個の文字列 s_1, … , s_N が半角スペース区切りで入力
⇒s_1, … , s_N を改行区切りで出力 という問題

まあこれも簡単なのですがNを使えていません

“`py
N = int(input())
arr = input().split()
for i in arr:
print(i)

“`

まあ使わなくてもいい場合があるのは知ってますがとりあえず使った場合を考えます
とはいってもそんなに差はない。
ポイントはN+1にならないこと(今まではN+1になってたので)
なぜN+1になるのかなぜNでよいのかというのを理解しておきたいところです

“`py
N = int(input())
arr = input().split()
for i in range

元記事を表示

2 行目で与えられる N 個の整数の入力 (large)

次はこれ(途中何題か簡単だったので飛ばしてます)
https://paiza.jp/works/mondai/stdin_primer/stdin_primer__integer_number_step4

これも一応簡単な部類に入るんだけど、
内容としてはこんな感じ。

“`py
N = int(input())
arr = input().split()

for i in arr:
print(int(i))
“`

で、ここで`map()`というものを使えるようにしようということで
前半をmap()とlist()を使って書いてみます

“`py
# map()を使わない書き方
arr = input().split()
for i in arr:
print(int(i))

# map()を使う書き方(※split()はsplit(” “)でもOK)
arr = list(map(int, input().split()))

#一応、下でもOK(list()がない)だった
arr = map(int,input().split())

#こうすると次の

元記事を表示

5 行の整数の入力

次のステップにはいって数題は簡単だったので飛ばしてここから
https://paiza.jp/works/mondai/stdin_primer/stdin_primer__integer_row_step3

整数 a_1, a_2, a_3, a_4, a_5 が 5 行で与えられる
⇒ a_1, a_2, a_3, a_4, a_5 を 5 行で出力 という問題
これは前回ステップの問題集にあったやり方
(input()にintで変換しておくの忘れてたけど通ってた)

“`py
arr =[0] * 5
for i in range(5):
arr[i] = input()

for i in arr:
print(i)

“`

他にもphpにあったような配列の追加方法
どっちがいいかというと、下の方かな?
あらかじめ数が決まっているのはあんまりなくて
不定の場合が多いので
さっき間違えてたけど、appendをapendと書かないように注意
pは2文字必要

“`py
arr =[]
for i in range(5):
value = int(i

元記事を表示

【出力形式を指定して出力】ペアの数値の入った表を罫線入りで出力 2 (paizaランク C 相当)

今回はこれ
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__specific_format_boss

ただし、AとBが9桁になるようにする

今までと同じように書いて
つぎに
(A, B) = 1+9+2+9+1=22文字(間は,と半スペで2文字)
|  =3文字
あわせて25文字
それをW-1分繰り返し、最後は(A, B)だけなので22文字だから
count = 25 * (W -1) + 22
これを=でかければOK

“`py
Arr = input().split()
H = int(Arr[0])
W = int(Arr[1])
A = int(Arr[2])
B = int(Arr[3])

for j in range(1,H+1):
for i in range(1,W+1):
if i != W:
print(f”({A:>9}, {B:>9})”,end=” | “)
else:
print(f”({A:

元記事を表示

ペアの数値の入った表を罫線入りで出力 (paizaランク C 相当)

今回の問題はこれ
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__specific_format_step4

自然数 H, W, A, B が与えられるので
ヨコW行、縦H行の(A,B)を ” | ” で区切ることという問題。

“`
2 3 7 8なら

(7, 8) | (7, 8) | (7, 8)
========================
(7, 8) | (7, 8) | (7, 8)
“`
というふうに出力する

まずは1行目を出力してみる

“`py
Arr = input().split()
H = int(Arr[0])
W = int(Arr[1])
A = int(Arr[2])
B = int(Arr[3])

for i in range(1,W+1):
if i != W:
print(f”({A}, {B})”,end=” | “)
else:
print(f”({A}, {B})”)

“`
次にH行分出力

“`p

元記事を表示

九九表を罫線入りで出力

今回はこの問題。今までの集大成に入った感じがする
– 九九表を、横の数値間では | (半角スペース 2 つとバーティカルライン)、縦の数値間では = で区切って出力
– 数値を出力する際は 2 けたになるよう半角スペース埋めで出力
– 縦の数値間で = を出力する際は、その上の行と文字数が等しくなるように出力

まずは九九表を罫線なしで出力してみる
“`py
for i in range(1,9+1):
for j in range(1,9+1):
if j != 9:
print(i * j, end=” “)
else:
print(i * j)
“`
ひとまずここまではできた
次に、ヨコの数値間は、普通にendのほうに、` | `に変えればいいはず
そして数字は2桁になるように半スペ梅でやる必要があるので
“`py
for i in range(1,9+1):
for j in range(1,9+1):
if j != 9:
print

元記事を表示

文字列と N 個の整数の出力 Python3編

次はこれ
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__specific_format_step2
文字列中に指定された整数を埋め込み、出力するという問題

間違ってないはずだったが間違っていたので調べてみると、
()と()の間はコンマだけだと思ってたら半スペも入ってたから。

“`py
Arr = input().split()
N = int(Arr[0])
A = int(Arr[1])
B = int(Arr[2])
for i in range(1,N+1):
if i != N:
print(f”({A}, {B})”,end=”, “)
else:
print(f”({A}, {B})”)

“`

元記事を表示

2 つの文字列を出力 Python3編

今回の問題はこれ
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__specific_format_step1

X
Y
と順番に文字列が出力されるのでそれを
X + Y = XYという形で出力せよという問題

“`py
S = input()
T = input()
print(f”{S} + {T} = {S}{T}”)

“`
fstringはformatと比べて直感的に書けて便利だな、と思う

でもとりあえずformatでもかけるようにはしておこう(どこかで、、、役に立つ、、、はず)
formatの書き方は覚えにくいが、置き換える箇所を{}で書いて、あとで、順番に置き換える箇所のフォーマットを引数としていく感じで考えればいい
“`py
S = input()
T = input()
print(“{} + {} = {}”.format(S, T, S + T))

“`

元記事を表示

OTHERカテゴリの最新記事