質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.35%
Python

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

Q&A

解決済

3回答

1194閲覧

2進数を2分割して、リストに格納し、それを違う10進数で表したいです。

M_Nishi

総合スコア2

Python

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

0グッド

0クリップ

投稿2020/10/29 01:59

前提・実現したいこと

ユーザーから、受け取った、10進数を2進数にして、2分割します。
それをリストに格納し、それを違う10進数で表したいです。

例えば、424896を2進数変換すると、以下の様になります。
1100111101111000000
この数値を1や0が2連続していたら、
それらをデコードして1、もしくは、0にします(例11→1、00→0)。
それを単一の0(separatorの役割)が来るまで続け、(例000、11011)それにぶつかったら、
再び終わりまで、デコードします。
上の2真数をこの方法で格納すると、 [1011, 11000]となります。
ここから、10進数に直すと出力は
[11, 24]になります。また、7(111)や24(11000)の様に最後が単一の1や0で終わる数字は
デコードしません。

該当のソースコード

php:filename.php

1def get_list(bit): 2 l= [] 3 bit = str(bit) 4 bit_sliced= bit[::2]#11→1、00→0 5 while bit== bit[len(bit)//2]: # 中心を割り出す 6 l.append(int(bit_sliced)) 7 break 8 l[1]= "," 9 l.append(int(bit_sliced)) 10 return l 11 12 13n = 1100111101111000000 14def get_list(bit): 15 l= [] 16 l2= [] 17 bit = str(bit) 18 bit_s= bit[:len(bit)//2] 19 bit2_s = bit[::2] 20 l.append(int(bit_s)) 21 l2.append(int(bit2_s)) 22 return l2+l 23print(get_list(n)) 24 25out: 26None 27[1011011000, 110011110]

試したこと

まず、Intからstrに型を変えて、色々と試しました。whileの方はNoneになってしまいます。
他にも.split(",")や正規表現のre.matchで000見つけたら、replaceなどをやりましたがダメでした。
まだまだ、python初心者ですが、よろしくお願いします。

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

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

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

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

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

guest

回答3

0

ベストアンサー

以下のように2個ずつ見て行って場合分けして処理すればよさそうです。

Python

1def conv(s): 2 ret = [] 3 one = '' 4 while True: 5 c = s[:2] 6 st = 2 7 if c == '01': # 途中の区切り 8 ret.append(one) 9 one = '' 10 st = 1 11 elif c == '00': # 0に 12 one += '0' 13 elif c == '11': # 1に 14 one += '1' 15 elif c == '': # ぴったり末尾 16 if len(one) > 0: 17 ret.append(one) 18 break 19 else: # 意図しない末尾 20 break 21 22 s = s[st:] 23 24 return ret 25 26s = bin(424896)[2:] 27print(conv(s)) # ['1011', '11000'] 28 29for s in ['','0','1','00','11','111', '11000']: 30 ret = conv(s) 31 print(s, ret)

投稿2020/10/29 02:55

can110

総合スコア38341

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

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

M_Nishi

2020/10/29 04:41

ご回答ありがとうございます。出力の部分で数値がリストから、外れて、空のリストが出来上がってしまうので、他の方の回答をベストアンサーとさせて、頂きました。
M_Nishi

2020/10/29 05:51

再び、申し訳ございません。ですが、自分でいくつかコードの出力の方を見直し、書き加えましたところ、can110様のコードが安定して、いるためこちらの回答をベストアンサーにさせていただきました。大変失礼しました。
guest

0

すみません、書かれてたコードが難しかったので、違う形で書いてしまいました。参考まで。
末尾が単一の0か1で終わる(=末尾に0か1が奇数個並んでいる)のは無視というのを読み落としていたので追記しました。
ところで、末尾以外に単一の1がいた場合はどうするんですか…? 「10011」とか。

python3

1def sep0(n): 2 ns = str(n).replace("101","1,1").split(",") 3 result = [] 4 for i, t in enumerate(ns): 5 if judge_odd(t): 6 continue 7 result.append(t) 8 return result 9 10def judge_odd(txt): 11 if len(txt.replace("10",",0").split(",")[-1])%2 != 0: 12 return True 13 elif len(txt.replace("01",",1").split(",")[-1])%2 != 0: 14 return True 15 else: 16 return False 17 18def doublet_to_single(txt): 19 result = "" 20 i = 0 21 while i < len(txt)-1: 22 if txt[i] == txt[i+1]: 23 result += txt[i] 24 i += 1 25 i += 1 26 return result 27 28n = "11101100111101111000000" 29sep = sep0(n) 30print(sep) 31# ['11001111', '1111000000'] 32 33single = [doublet_to_single(i) for i in sep] 34print(single) 35# ['1011', '11000'] 36 37dec = [int(r,2) for r in single] 38print(dec) 39# [11, 24]

投稿2020/10/29 02:42

編集2020/10/29 03:10
jeanbiego

総合スコア3966

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

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

M_Nishi

2020/10/29 04:39

ご回答、ありがとうございました。例えばその数値ですと1を残したまま、00と11をデコードするという様に考えています。コードの方はとても参考になりました。本当にありがとうございました。
guest

0

こういうことでしょうか。

Python

1src = bin(424896)[2:] 2dst = [ 3 re.sub(r'(.){2}', r'\1', l) # 二連続する文字を潰す。 4 for l in re.split(r'(?<=1)0(?=1)', src) # 1で挟まれた0で分割して、 5] 6 7print(dst) # => ['1011', '11000']

投稿2020/10/29 09:34

LouiS0616

総合スコア35668

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問