質問するログイン新規登録
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

320閲覧

Python リストのデータを文字列から数値に変換したい

kouchan_dd

総合スコア20

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2024/05/27 06:48

0

0

実現したいこと

Pythonで以下のようなプログラムを作りたいです。

文字列の1文字ずつの2進数の結果表示後に、2つの正整数 n,m を入力(カンマ区切りで入力)させて n番目の第mビットの値を表示させるようにせよ.但しn,mは0から始まるものとする.

実行例:
文字列: ABC
A : 01000001
B : 01000010
C : 01000011
m: 1
n: 3 (1番目(=B)の第3ビット 010[0]0010 を指定)
1番目の文字の第3ビットは 0 です

※注意:「n番目の文字のmビット目」に対応するプログラム内のデータは、「数字」の "0" "1" ではなく、「数値」の 0 または 1 を要素とする2次元のリストの形式にすること。

発生している問題・分からないこと

プログラム自体はできたのですが、上の「※注意」にある、「数字(文字列)」ではなく、「数値」を要素とする2次元のリストの形式にする方法が分かりません。

ご教授いただけたら幸いです。

該当のソースコード

Python

1str = input('文字列:') 2binary_representations = [] 3 4for s in str: 5 c=ord(s) 6 7 b=bin(c) 8 b=b[2:] 9 b="00000000"+b 10 b=b[-8:] 11 binary_representations.append(b) 12 print(s+":"+b) 13 14m = int(input('m:')) 15n = int(input('n:')) 16target_char_binary = binary_representations[n-1] 17ans = target_char_binary[m-1] 18print(f'{m}番目の文字の第{n}ビットは{ans}です')

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

Googleで「map関数」というものがあったので、以下のようにプログラムを作り変えました。

Python

1str = input('文字列:') 2binary_representations = [] 3 4for s in str: 5 c=ord(s) 6 7 b=bin(c) 8 b=b[2:] 9 b="00000000"+b 10 b=b[-8:] 11 binary_representations.append(b) 12 print(s+":"+b) 13 14m = int(input('m:')) 15n = int(input('n:')) 16binary_representations = list(map(int, binary_representations)) 17target_char_binary = binary_representations[n-1] 18ans = target_char_binary[m-1] 19print(f'{m}番目の文字の第{n}ビットは{ans}です')

しかし、以下のようなエラーが出てしまいました。


TypeError Traceback (most recent call last)
Cell In [12], line 18
16 binary_representations = list(map(int, binary_representations))
17 target_char_binary = binary_representations[n-1]
---> 18 ans = target_char_binary[m-1]
19 print(f'{m}番目の文字の第{n}ビットは{ans}です')

TypeError: 'int' object is not subscriptable

補足

特になし

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

melian

2024/05/27 07:59

> n番目の第mビットの値を表示させるようにせよ.但しn,mは0から始まるものとする. 本題とは無関係ですが、最初のプログラムの、 m = int(input('m:')) n = int(input('n:')) target_char_binary = binary_representations[n-1] ans = target_char_binary[m-1] print(f'{m}番目の文字の第{n}ビットは{ans}です') は、 n = int(input('n:')) m = int(input('m:')) target_char_binary = binary_representations[n] ans = target_char_binary[m] print(f'{n}番目の文字の第{m}ビットは{ans}です') でしょう。n,m は 0 始まり(0-base index)なので、[n-1] や [m-1] ではなく [n], [m] になります。また、「n番目の第mビットの値」なので、print(f'{n}番目の文字の第{m}ビットは{ans}です') となるはずです。
guest

回答2

0

「n番目の文字のmビット目」に対応するプログラム内のデータは、「数字」の "0" "1" ではなく、「数値」の 0 または 1 を要素とする2次元のリストの形式にすること。

もしかしたら,ビット演算子の使用も狙いかもしれません。

ビット演算子(ビット AND: &)と三項演算子を用いて2次元リストの要素(0, 1)を得る記述例を下記に示します。

Python

1in_str = 'ABC' 2 3for s in in_str: 4 print(f"{s}: {ord(s):08b}") 5# A: 01000001 6# B: 01000010 7# C: 01000011 8 9bit_lst = [] 10for i, s in enumerate(in_str): 11 bit_lst.append([]) 12 for j in range(8): 13 b = 1 if ord(s) & 2**(7 - j) > 0 else 0 14 bit_lst[i].append(b) 15print(bit_lst) 16# [[0, 1, 0, 0, 0, 0, 0, 1], [0, 1, 0, 0, 0, 0, 1, 0], [0, 1, 0, 0, 0, 0, 1, 1]] 17 18n, m = 1, 3 19print(f"{n}番目の文字 '{in_str[n]}' の第{m}ビット目は {bit_lst[n][m]} です") 20# 1番目の文字 'B' の第3ビット目は 0 です

投稿2024/05/27 14:12

little_street

総合スコア505

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

mapを使う場所がちょっと間違えています。

python

1binary_representations = list(map(int, binary_representations))

binary_representationsはリストのリストなので、mapを掛けたい対象はもういちだん下の階層にする必要があります。そうするのはちょっと面倒なので、最初にリストを作るタイミングでやるのがいいと思います。

python

1 b=b[-8:] 2 binary_representations.append(b)

この2行の間は、0か1の文字の配列になっているので、ここでmapを使って数値に変換できます。

投稿2024/05/27 09:10

TakaiY

総合スコア14608

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kouchan_dd

2024/05/31 08:17

回答ありがとうございます。 試したところ問題が解決しました! ベストアンサーに選ばせていただきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問