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

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

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

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

Q&A

解決済

2回答

5729閲覧

リストの要素の並び順をすべて試すこととそれに付随した計算

退会済みユーザー

退会済みユーザー

総合スコア0

Python

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

0グッド

0クリップ

投稿2017/06/27 01:00

編集2017/06/27 01:37

リストの要素の並び順をすべて試すこととそれに付随した計算をしたいです。

a = [2,5,7,3,6] b = [1,3,6,8,4]

という配列があった時
まず、
この配列の要素aの並び順を全部出力させたいです。例えば、
[2,6,7,3,5]や[7,5,2,3,6]や[6,2,5,7,3,6]などです。
次に配列a・bの順番が対応しているとして
配列aで入れ替えた要素(例えばa[0]とa[1]を入れ替えるとき)番目の配列bの要素を足すということをしたいです(b[0]である1を算出する)。
例えば、a[1]とa[4]を配列aの最初に持ってくるとすると[5,6,2,7,3]という順番になりますが、そのときは2,7,3の位置が変わっているので1+6+8=15を算出させたいです。ちなみに、a[0]とa[1]を入れ替えるとき[5,2,7,3,6]になりますが、この時は1を算出させたく、元のa[1](=5)の位置も変わっているのですが、a[1]のインデックス数(=1)よりも前に要素を持ってくるときは加算しないとします。
再帰関数を使い、配列a・bの計算を同時に行えるようにfor文などでいっぺんに計算できるようにすればやりたいアルゴリズムの実装ができるとはおもうのですが、どのように書けばいいのでしょうか?

思いついた方法は

a = [2,5,7,3,6] b = [1,3,6,8,4] list_sum = [] for i in range(len(a)*len(a)): a[i] = a[i+1] list_sum.append(list_sum)

で、配列の要素の階乗回ループを回して配列に要素を追加すればいいと思うのですがこの先の方法が思い浮かばず。
ナップザック問題などを参考にしているのですが。

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

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

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

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

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

mattn

2017/06/27 01:20

思いついたところまでのコードを書いて下さい。
mattn

2017/06/27 01:20

とっかかりのヒントだけ itertools.permutations
退会済みユーザー

退会済みユーザー

2017/06/27 01:38

思いついたコードを書きました。もし何かお分かりでしたらお願いします!
mattn

2017/06/27 01:42

itertools.permutations は使ってみられましたか?
Lhankor_Mhy

2017/06/27 12:11

ご提示のコードを見る限りかなり混乱していると思います。とりあえず、①順列の列挙と、②集計対象となる要素の抽出と、③その集計と、を分けて考えた方がいいと思いますよ。順番にひとつずつ取り組むことをお勧めします。
guest

回答2

0

ベストアンサー

仕様の理解はこれで正しいのか自信がありませんが。

python

1print ( [ ( 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 ) ] )

それにしてもクソコードですねw
一応動きますが無駄があるので、適切に直して使ってください。

投稿2017/06/29 06:48

Lhankor_Mhy

総合スコア35865

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

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

退会済みユーザー

退会済みユーザー

2017/06/30 01:08

ありがとうございます。1行で書けるものなのですね!!ただ記載してくださったコードの流れがちょっと理解できなくて...。zip( a, b )でa・b配列をひとまとめにして、それを辞書型にしているところはわかるのですが、for i, v in enumerate(x)でxをインデックス付きのタプル型にし、それをfor文で回しているのはこの実現したいことに対してどういう役割なのでしょうか?あと、if i > a.index( v ) はどういう条件指定なのでしょうか?
Lhankor_Mhy

2017/06/30 01:21

「a[1]のインデックス数(=1)よりも前に要素を持ってくるときは加算しないとします」という条件のチェックです。ここでの i は x(aの順列のひとつ)における値 v のインデックス数であり、a.index(v) は言うまでもなく元のリストにおける値 v のインデックス数ですから、それらを比較することによって「前に要素を持ってくるとき」であるかどうかを処理しています。
guest

0

a,bともに、同じ値が複数含まれていない事を前提にして回答します。

「要素aの並び順を全部」の部分は、mattnさんがコメントしてらっしゃるように itertools.permutationsを利用するのが良いと思います。

aとbの要素間の関連付けは、辞書オブジェクトを利用すると見通しの良いコードになると思います。
aの要素をキーとし、bの要素を値とする辞書オブジェクト(dict)は、次のようにして作れます。

dict = {} #空の辞書オブジェクトから始める for index in range(5) dict[a[i]]=b[i] #a[i]がキー、b[i]が値である要素を辞書オブジェクト dictに追加

この辞書を使うと、aの要素に対応するbの値を取り出すことができます。
例えば、「aの2,7,3の位置にあるbの値の合計を求めたい」(aの2,7,3に対応するbの値を合計したい)のであれば、合計を変数totalに代入するコードは以下のようになります。

total = dict[2]+dict[7]+dict[3]

投稿2017/06/27 04:09

coco_bauer

総合スコア6915

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

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

退会済みユーザー

退会済みユーザー

2017/06/27 12:14

ありがとうございます。質問なのですが、 # coding: utf-8 import itertools a = [2,5,7,3,6] b = [1,3,6,8,4] x = list(itertools.permutations(a)) dict = {} #空の辞書オブジェクトから始める for i in range(5): # a[i]がキー、b[i]が値である要素を辞書オブジェクト dictに追加 dict[x[i]]=b[i] print(dict) と書いて実行しても、 {(2, 5, 7, 6, 3): 3, (2, 5, 3, 7, 6): 6, (2, 5, 7, 3, 6): 1, (2, 5, 6, 7, 3): 4, (2, 5, 3, 6, 7): 8} のような出力になってしまいました。xではリストの要素の通りを全部出力できたのですが、それに付随してbが値である辞書オブジェクトを作ることができませんでした。私のコードが間違っているのですよね?間違いを指摘してもらえたらと思います
coco_bauer

2017/06/28 00:24

dictは、元々のaとbの間の関連付け情報ですから、dict[a[i]]=b[i]をforで回さなければなりません。そして、dictを使ってxの各要素(aを並び替えた結果)をbを同様に並び替えた結果に変換して行くのです。xの要素数が常に5であるとは考えられないので、x[i]のところで間違えている事に気づくべきです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問