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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

2回答

359閲覧

ある数値を関数で変換した新たな数値を、桁ごとにリスト化したい

yosshi

総合スコア11

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/06/02 03:30

編集2018/06/02 04:28

前提・実現したいこと

1を2個、0を10個並べた順列を、2つの1の現れる項の小さい順にナンバリングしたうえで、それを用いて、ナンバリングした数字を打ち込めば順列の配列ができるようにしたい。
例えば、
1を入力したときに、110000000000を対応させて、lを[1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]という配列になるようにしたいのです。
また、12を入力したときには、011000000000を対応させて、lが[0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]という配列になるようにしたい。

発生している問題・エラーメッセージ

Please Enter Number1 Traceback (most recent call last): File "enzan3.py", line 11, in <module> l = [int(x) for x in list(str(n))] File "enzan3.py", line 11, in <listcomp> l = [int(x) for x in list(str(n))] ValueError: invalid literal for int() with base 10: '<'

該当のソースコード

Python

1import numpy as np 2m = input("Please Enter Number") 3for m in range(1, 12): 4 def n(m): 5 10**12+10**m 6 7for m in range(12, 22): 8 def n(m): 9 10**11+10**m 10 11l = [int(x) for x in list(str(n))] 12#(以下略)

試したこと

定義の時点でintやstrを入れてみましたがダメでした。

補足情報(FW/ツールのバージョンなど)

Python3.6

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

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

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

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

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

LouiS0616

2018/06/02 03:36

どのようなルールで『変形』したいのか、説明を追記してください。
guest

回答2

0

やりたいのはこんなんですかね。質問がよくわからないので当てずっぽうですが。

Python

1mylist_1 = [10**12+10**m for m in range( 1, 12)] # リスト内包表記を使った 2mylist_2 = [10**11+10**m for m in range(12, 22)] # 同上 3 4mylist = mylist_1 + mylist_2 # リストの連結

追記

def func(m): return 10**12+10**m m = 1 num = func(m) l = list(str(num)) # もしくは l = list(map(int, l))

もっと追記

def func(i, j): mylist = [0]*12 mylist[i], mylist[j] = 1, 1 return mylist mylist = [] for i in range(2): for j in range(i+1,12): mylist.append(func(i, j))

投稿2018/06/02 04:20

編集2018/06/02 05:08
tachikoma

総合スコア3601

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

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

yosshi

2018/06/02 04:23

ありがとうございます。 質問が分かりにくくて申し訳ないです。どう表現したらいいのかがよくわからなくて......。 具体的には、 1を入力したときに、110000000000を対応させて、lを[1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]という配列になるようにしたいのです。 また、12を入力したときには、011000000000を対応させて、lが[0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]という配列になるようにしたいのです。
tachikoma

2018/06/02 04:29

追記しましたが、こういうことですかね?一番上の桁が0の場合も考えますか?
yosshi

2018/06/02 04:33

ありがとうございます。 そういうことです。 mが1から11までの自然数の時、m=1と同様な処理を行い、12から21までの自然数のときは、011000000000のような1番上の位が0となる形で1対1対応させていきたいです。
tachikoma

2018/06/02 04:51

下12桁だけを取り出す、ということですか?
yosshi

2018/06/02 04:58

1が2個、0が10個の順列で、1が出てくる項が早い順にナンバリングしたいんです。 1:110000000000 2:101000000000 3:100100000000 …… 11:100000000001 12:011000000000 13:010100000000 …… 21:010000000001 22:001100000000 …… のような形で
tachikoma

2018/06/02 05:09

目的のことをやるためだけのスクリプトに直しました。最初のrange(2)をrange(11)までやれば最後まで順列は取れます。
yosshi

2018/06/02 05:18

もっと追記のほうを試してみました。 1項目か2項目に1が存在する全ての配列は出てきたのですが、これをナンバリングするにはどうしたらよいのでしょうか。 辞書を定義してそこから引っ張ってくるのが一番確実なんですかね?
yosshi

2018/06/02 05:19

あっ、ごめんなさい。 うまく更新されてなかったので最新のAが出てきていませんでした。 試してみます。
yosshi

2018/06/02 05:20

ありがとうございます。
tachikoma

2018/06/02 05:29

外側のmylistの並びがナンバリングの順序そのものなんですが、別のキーを当てたい場合はdictにしてもいいかもしれませんね。
guest

0

defは関数の定義であって呼び出しではないので、そのコードで関数を定義している意味はありません。というか、意図通り動いていません。

エラーの原因はlist(str(n))が何になっているか確認してみるとわかります。

python

1>>> def n(): 2... pass 3... 4>>> str(n) 5'<function n at 0x7f5161ae1f28>' 6>>> list(str(n)) 7['<', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', 'n', ' ', 'a', 't', ' ', '0', 'x', '7', 'f', '5', '1', '6', '1', 'a', 'e', '1', 'f', '2', '8', '>']

str(func)で関数オブジェクトを表す文字列が返るので、それを変換しようとしてしまっています・・・。

追記

python

1for m in range(1, 12): 2 def n(m): 3 10**12+10**m 4for m in range(12, 22): 5 def n(m): 6 10**11+10**m

これは関数の定義ではなく、for文の中で関数を定義しているだけです(しかもreturnもしていないから無意味な関数だし・・・)。for文を回している意味もないし(何回定義しても最後に定義されたものしか残らないし、そもそもforで値が束縛されるmと仮引数のmとが別物なので意味ないとか、それ以前にnを呼び出していないとか・・・)、何がしたいのかよくわかりません。

追記2

1つずつ加算で計算するコードはなんか書けました。

python

1def incr_enzan(lst): 2 result_lst = lst[:] 3 if lst[-1] != 1: 4 first_one_passed = False 5 for i, x in enumerate(lst): 6 if x == 1 and not first_one_passed: 7 first_one_passed = True 8 elif x == 1 and first_one_passed: 9 break 10 result_lst[i] = 0 11 result_lst[i+1] = 1 12 else: 13 for i, x in enumerate(lst): 14 if x == 1: 15 break 16 result_lst[-1] = 0 17 result_lst[i] = 0 18 result_lst[i+1] = 1 19 result_lst[i+2] = 1 20 return result_lst 21 22 23lst = [1,1,0,0,0,0,0,0,0,0,0,0] 24print(1, lst) 25 26for x in range(2, 67): 27 lst = incr_enzan(lst) 28 print(x, lst) 29""" 301 [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 312 [1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0] 323 [1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0] 334 [1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0] 345 [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0] 356 [1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0] 367 [1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0] 378 [1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0] 389 [1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0] 3910 [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0] 4011 [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1] 4112 [0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0] 4213 [0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0] 4314 [0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0] 4415 [0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0] 4516 [0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0] 4617 [0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0] 4718 [0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0] 4819 [0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0] 4920 [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0] 5021 [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1] 5122 [0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0] 5223 [0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0] 5324 [0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0] 5425 [0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0] 5526 [0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0] 5627 [0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0] 5728 [0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0] 5829 [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0] 5930 [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1] 6031 [0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0] 6132 [0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0] 6233 [0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0] 6334 [0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0] 6435 [0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0] 6536 [0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0] 6637 [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0] 6738 [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1] 6839 [0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0] 6940 [0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0] 7041 [0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0] 7142 [0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0] 7243 [0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0] 7344 [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0] 7445 [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1] 7546 [0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0] 7647 [0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0] 7748 [0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0] 7849 [0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0] 7950 [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0] 8051 [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1] 8152 [0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0] 8253 [0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0] 8354 [0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0] 8455 [0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0] 8556 [0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1] 8657 [0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0] 8758 [0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0] 8859 [0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0] 8960 [0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1] 9061 [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0] 9162 [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0] 9263 [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1] 9364 [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0] 9465 [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1] 9566 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1] 96"""

もしかしたら式1つでn番目の項が出せるかもしれませんが、思いつかなかったので得意な人に譲ります・・・。
こういうコードで一式出して、辞書に突っ込んでおけば良いでしょう。

投稿2018/06/02 03:37

編集2018/06/02 05:08
hayataka2049

総合スコア30933

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

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

yosshi

2018/06/02 03:54

ありがとうございます。 別のファイルに定義を書いて変形したうえで、importしてくれば良いのでしょうか。
hayataka2049

2018/06/02 04:01

別にファイルをもう一つ作る必要はないと思いますが・・・とりあえず、何をしようとしているのかちゃんと言葉で説明してくれませんか? あと、関数の使い方を理解していない気がするので、なんか入門記事とか探して理解してください・・・
yosshi

2018/06/02 04:08

1から66の自然数に対して、1が2個、0が10個の順列を1対1対応させたいのです。今回のはその一部をやりたかったのですが……。 辞書型で66項目作るのが時間はかかりますが確実なんですかね……。
hayataka2049

2018/06/02 04:14

その説明ではわからないので、なにか具体的な入力をしたときに、どんな処理をしてlがどんなリストになっていれば良いのか、説明してください
yosshi

2018/06/02 04:20

例えば1を入力したときに、110000000000を対応させて、lを[1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]という配列になるようにしたいのです。 また、12を入力したときには、011000000000を対応させて、lが[0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]という配列になるようにしたいのです。
hayataka2049

2018/06/02 04:27

察するに、こういうことですか? 1:110000000000 2:101000000000 3:100100000000 4:100010000000 5:100001000000 6:100000100000 7:100000010000 8:100000001000 9:100000000100 10:100000000010 11:100000000001 12:011000000000
yosshi

2018/06/02 04:29

そういうことです。 それを66まで1対1対応させたうえで、配列に直したいです。
hayataka2049

2018/06/02 04:37

1-11 12-22 23-33 34-44 45-55 56-66 66までというのは、の6区間は考えるということですか?
yosshi

2018/06/02 04:53

いえ 1-11で1項目に1がある配列 12-21で1項目が0で2項目に1がある配列 22-30で1項目と2項目が0で3項目に1がある配列 ……という感じにしていきたいのです。 つまり1が早く出てくる順番にナンバリングしたいです。
hayataka2049

2018/06/02 04:55

ああそうか、区間が狭くなっていくんですね ・・・面倒くさいな、どうやって実装したものか
yosshi

2018/06/02 05:00

66通り全て辞書に入れてしまって、そこから引っ張ってくるのが確実なんですかね……?
hayataka2049

2018/06/02 05:03

私ならそうする気がします
yosshi

2018/06/02 05:07

ありがとうございます。試してみます。
hayataka2049

2018/06/02 05:09

いちおう自動で出せるようにはしたので、追記してみました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問