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

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

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

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

Q&A

解決済

2回答

1982閲覧

1行で表せるコードを分割して書きたい

退会済みユーザー

退会済みユーザー

総合スコア0

Python

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

0グッド

1クリップ

投稿2017/07/01 08:22

1行で表せるコードを分割して書きたいです。

# coding: utf-8 import itertools a = [2,5,7,3,6] b = [1,3,6,8,4] print ( [ ( sum( [ dict( zip( a, b ) )[v] for i, v in enumerate(x) if i > a.index( v ) ] ), list(x) ) for x in itertools.permutations( a ) ] )

のprint文の一文でコードを分割して書きたいです。

今、

# coding: utf-8 a = [2,5,7,3,6] b = [1,3,6,8,4] def permutations(iterable, r=None): # permutations('ABCD', 2) --> AB AC AD BA BC BD CA CB CD DA DB DC # permutations(range(3)) --> 012 021 102 120 201 210 pool = tuple(iterable) n = len(pool) r = n if r is None else r if r > n: return indices = list(range(n)) cycles = list(range(n, n-r, -1)) yield tuple(pool[i] for i in indices[:r]) while n: for i in reversed(range(r)): cycles[i] -= 1 if cycles[i] == 0: indices[i:] = indices[i+1:] + indices[i:i+1] cycles[i] = n - i else: j = cycles[i] indices[i], indices[-j] = indices[-j], indices[i] yield tuple(pool[i] for i in indices[:r]) break else: return for x in permutations(a): for i, v in enumerate(x): if i > a.index(v): print(sum([dict(zip(a, b))])[v])

で最初のコードとまったく同じ意味だと思ったのですが、

Traceback (most recent call last): File "test4.py", line 65, in <module> print(sum([dict(zip(a, b))])[v]) TypeError: unsupported operand type(s) for +: 'int' and 'dict'

とエラーが出ました。
何が間違っているのでしょうか?

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

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

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

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

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

guest

回答2

0

ベストアンサー

以下のようになります

python

1import itertools 2 3a = [2,5,7,3,6] 4b = [1,3,6,8,4] 5 6result = [] 7for x in itertools.permutations(a): 8 tmp = [] 9 for i, v in enumerate(x): 10 if i > a.index(v): 11 # 整数1, 3, 6, 8, 4 のどれかがtmpに格納されていく 12 tmp.append( 13 dict(zip(a, b))[v] 14 ) 15 16 result.append( 17 (sum(tmp), list(x)) 18 ) 19print(result) 20

リスト内包表記なんかを通常のループに分解する場合は、.append()等で要素を追加することを忘れないようにしておくと良いです。
今回の例は複雑ですが、以下のようにしてpprintで見やすく表示したり少しづつ式を分解していくと途中の経過がわかり、仕組みの理解につながります。

python

1import itertools 2 3a = [2, 5, 7, 3, 6] 4b = [1, 3, 6, 8, 4] 5 6from pprint import pprint 7# もともとの 8pprint([(sum([dict(zip(a, b))[v] for i, v in enumerate(x) if i > a.index(v)]), list(x)) for x in itertools.permutations(a)]) 9 10# sum部分をはずす 11pprint([([dict(zip(a, b))[v] for i, v in enumerate(x) if i > a.index(v)], list(x)) for x in itertools.permutations(a)]) 12 13# [v]などの辞書キー部分をはずす 14pprint([([dict(zip(a, b)) for i, v in enumerate(x) if i > a.index(v)], list(x)) for x in itertools.permutations(a)])

投稿2017/07/01 10:36

編集2017/07/01 10:49
toritoritorina

総合スコア972

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

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

0

とりあえず、そのコードと元コードに適当に改行を入れて見直してみては?

python

1sum( 2 [ 3 dict( 4 zip( a, b ) 5 )[v] for i, v in enumerate(x) if i > a.index( v ) 6 ] 7)

python

1sum( 2 [ 3 dict( 4 zip(a, b) 5 ) 6 ] 7)[v]

だいぶ違いますよね。

投稿2017/07/01 10:04

Lhankor_Mhy

総合スコア36074

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

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

退会済みユーザー

退会済みユーザー

2017/07/01 11:20

回答ありがとうございます。私もそう考えて、 sum( [ dict( zip(a, b) ) ] )[v] の上に for x in permutations(a): for i, v in enumerate(x): if i > a.index(v): で条件分岐やfor文を持ってきたのにうまくいきませんでした。なぜなのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問