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

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

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

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

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

Python

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

Q&A

解決済

3回答

983閲覧

差し込み処理(format)で空白を含んだ入力をしたい

shu-san

総合スコア5

Python 3.x

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

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

Python

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

0グッド

1クリップ

投稿2021/08/19 02:29

前提・実現したいこと

実現したいこと:
・コード内のmod="{} ~ {} + {} + {}"に差し込み処理で変数を埋め込みそれらの組み合わせを出力させようとしています。
・現状のやり方では{}の数だけ変数を入力する必要がありますが、
空欄も含んだ入力をして、右辺(~より右側)を3変数だけでなく2変数や1変数の組み合わせも出力もさせたいと思っています(例:出力させたい結果)。

条件:
・代入する変数名は、読み込んだcsvファイル内に記載されている必要があります。
・この段階では必要ありませんが、csvファイル内の各変数には1次元の数値配列が与えられています。

アルゴリズムや、参考コードなどわかる方がいらっしゃればアドバイス・ご教示をぜひお願いします。

出力させたい結果

現状の出力 word1 ~ word2 + word3 + word4 word1 ~ word2 + word3 + word5 word1 ~ word2 + word4 + word5 word1 ~ word3 + word4 + word5 word2 ~ word1 + word3 + word4 word2 ~ word1 + word3 + word5 word2 ~ word1 + word4 + word5 word2 ~ word3 + word4 + word5 word3 ~ word1 + word2 + word4 word3 ~ word1 + word2 + word5 word3 ~ word1 + word4 + word5 word3 ~ word2 + word4 + word5 word4 ~ word1 + word2 + word3 word4 ~ word1 + word2 + word5 word4 ~ word1 + word3 + word5 word4 ~ word2 + word3 + word5 word5 ~ word1 + word2 + word3 word5 ~ word1 + word2 + word4 word5 ~ word1 + word3 + word4 word5 ~ word2 + word3 + word4 出力させたい結果(例:word1に関してのみ) word1 ~ word2 + word3 + word4 word1 ~ word2 + word3 + word5 word1 ~ word2 + word4 + word5 word1 ~ word3 + word4 + word5 word1 ~ word2 + word3 word1 ~ word2 + word4 word1 ~ word2 + word5 word1 ~ word3 + word5 word1 ~ word4 + word5 word1 ~ word2 word1 ~ word3 word1 ~ word4 word1 ~ word5

現状のコード

Python3

1import itertools 2from scipy.special import perm, comb 3import pandas as pd 4 5#データ読み込み 6test = pd.read_csv('C:/Users/~~~') 7 8#リスト作成(word1~word5は読み込んだcsvファイル内に記載されている) 9word1 = 'word1' 10word2 = 'word2' 11word3 = 'word3' 12word4 = 'word4' 13word5 = 'word5' 14word_list0 = [word1, word2, word3, word4, word5] 15 16word_list_p0 = list(itertools.permutations(word_list0, 1)) 17word_list_p1 = list(itertools.combinations(word_list0, 3)) 18 19#組み合わせ作成 20for i in range(perm(len(word_list0), 1, exact=True)): 21 for j in range(comb(len(word_list0), 3, exact=True)): 22 y0 = word_list_p0[i] 23 y1 = word_list_p1[j] 24 25 mod="{} ~ {} + {} + {}" 26 27 mod=(mod.format(y0[0],y1[0],y1[1],y1[2])) 28 29 if y0[0] != y1[0] and y0[0] != y1[1] and y0[0] != y1[2]: 30 print(mod) 31

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

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

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

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

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

guest

回答3

0

strのformatメソッドを使うと以下のように書けます。

python

1>>> print(word_list0) 2['word1', 'word2', 'word3', 'word4', 'word5'] 3>>> from itertools import permutations 4>>> 5>>> N = 4 6>>> for n in range(N, 1, -1): 7... for seq in permutations(word_list0, n): 8... print(("{} ~ {}" + " + {}" * (n-2)).format(*seq)) 9... 10word1 ~ word2 + word3 + word4 11word1 ~ word2 + word3 + word5 12word1 ~ word2 + word4 + word3 13word1 ~ word2 + word4 + word5 14word1 ~ word2 + word5 + word3 15word1 ~ word2 + word5 + word4 16word1 ~ word3 + word2 + word4 17word1 ~ word3 + word2 + word5 18word1 ~ word3 + word4 + word2 19途中略 20word4 ~ word1 21word4 ~ word2 22word4 ~ word3 23word4 ~ word5 24word5 ~ word1 25word5 ~ word2 26word5 ~ word3 27word5 ~ word4

投稿2021/08/19 09:35

ppaul

総合スコア24668

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

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

shu-san

2021/08/19 11:37

回答ありがとうございます! 非常に短いコードで解決されていて非常に勉強になりました! このformatメソッドの使い方については不勉強でした。学ばせていただきます。
guest

0

ベストアンサー

「空欄も含んだ入力」というものがよく分かりませんが、欲しい結果は以下のようなものでしょうか。

Python

1import itertools 2import numpy as np 3 4words = [f'word{i+1}' for i in range(5)] 5 6# 最初に左辺となる一つを取り除いたリストから 7# すべての組み合わせのパターンに対応する配列位置を列挙しておく 8# この配列位置は、左辺となる一つが何であれ共通で利用できる 9comb_idx = [] 10n_words = len(words) 11comb_max = n_words - 2 12for cnt in range(comb_max, 0, -1): 13 for e in itertools.combinations(range(n_words-1), cnt): 14 comb_idx.append(list(e)) # 15 16# 元のリストから左辺となるwordを順に列挙 17for leff_word in words: 18 # 左辺となる一つを取り除いたリスト 19 # ファンシーインデックスが使えるようにnumpy.arrayにする 20 comb_words = np.array([w for w in words if w != leff_word]) 21 22 # すべての組み合わせ(の配列位置) 23 for e in comb_idx: 24 print(f'{leff_word} ~ {" + ".join(comb_words[e])}') 25 print('-----') 26 27""" 28word1 ~ word2 + word3 + word4 29word1 ~ word2 + word3 + word5 30word1 ~ word2 + word4 + word5 31word1 ~ word3 + word4 + word5 32word1 ~ word2 + word3 33word1 ~ word2 + word4 34word1 ~ word2 + word5 35word1 ~ word3 + word4 36word1 ~ word3 + word5 37word1 ~ word4 + word5 38word1 ~ word2 39word1 ~ word3 40word1 ~ word4 41word1 ~ word5 42----- 43word2 ~ word1 + word3 + word4 4445word5 ~ word4 46"""

投稿2021/08/19 08:33

can110

総合スコア38339

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

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

shu-san

2021/08/19 11:41 編集

回答ありがとうございます! ご教授いただいた内容で、まさに出力したかった結果を得ることができました。 左辺と右辺で分けることは考えてはいたのですが、ファンシーインデックスも含めて実装方法が勉強不足でした。これを機に学ばせていただきます。
guest

0

変数が2個の場合、3個の場合、4個の場合と条件で分けて処理すればいいのでは

あるいは、format使わずに普通に文字列連結で、変数のナカミを見ながらつなげていくとか

投稿2021/08/19 02:32

編集2021/08/19 02:39
y_waiwai

総合スコア88024

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

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

shu-san

2021/08/19 11:32

返信遅れましてすみません。回答ありがとうございます! 確かにそうなんですが、力技以外の解決方法を知りたかった次第です。
y_waiwai

2021/08/19 11:34

力技以外はなさそーなきが。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問