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

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

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

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python

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

Q&A

2回答

3163閲覧

Pythonでリスト内における要素の組み合わせ方

learning

総合スコア7

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python

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

0グッド

0クリップ

投稿2017/05/12 07:07

編集2017/05/12 15:40

下記のように、6種類のリストに文字列が60個ずつ入っています。

List1A=[“1a1”, “1a2”…”1a60”] List1B=[“1b1”, “1b2”…”1b60”] List1C=[“1c1”, “1c2”…”1c60”] List2A=[“2a1”, “2a2”…”2a60”] List2B=[“2b1”, “2b2”…”2b60”] List2C=[“2c1”, “2c2”…”2c60”]

これらをぞれぞれrandom.shuffle()シャッフルし、さらに9つの組み合わせリストに分配していきます。

list1A2A=[(1a1, 2a10), (1a15, 2a39)…] list1A2B=[…] list1A2C=[…] list1B2A=[…] list1B2B=[…] list1B2C=[…] list1C2A=[…] list1C2B=[…] list1C2C=[…]

その際、上記のように2つのリストの組み合わせとして、6つのリストからそれぞれ20個ずつ文字列を取り出していき、新しいリストにペアで格納します。例えば、list1A2Aにはlist1Aから20個、list2Aから20個、のようにです。その際、文字列は重複しません。そして9つのリストと、合計180の文字列の組み合わせができます。

その後、全てのペアを再度シャッフルしてまとめた、下記のような組み合わせ一覧 (リスト) を作成したいのです。

listAll = [[(1a1, 2a10), list1A2A], [(2b30, 1c15), list1C2B], [(1b55, 2b40), list1B2B], ... [(2c35, 1a3), list1A2C]]

この時、ペア文字列の最初の要素 (上記の1a1や2b30、1b55) にlist1Aから1Cの90個、要素2 (上記の2a10や1c15、2b40) にlist2Aからlist2Cの90個、と半分ずつになるよう分配したいのです。
再度シャッフルして、listAllにまとめると、ペア文字列の最初の要素が常にlist1A、list1B、list1Cのいずれかになってしまうため、180の文字列組み合わせで、半分はlist1系列、もう半分はlist2系列の要素が先頭になるように作ります。

初歩的な質問で恐縮ですが、ご教示いただければ幸いです。

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

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

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

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

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

Lhankor_Mhy

2017/05/12 07:32

分からない部分はどこですか?
learning

2017/05/12 08:03

説明不足で申し訳有りません。6つのリストをシャッフルした後、9つのリストに分配する箇所からご教示いただければ幸いです。
Lhankor_Mhy

2017/05/12 09:08

『ペアの要素1にlist1Aから1Cの90個、要素2にlist2Aからlist2Cの90個』という部分がよく分からないのですが…… list1A2Aとはまた別にタプルを作るという理解で合っていますか?
magichan

2017/05/12 09:56

180個のペアを90個づつに分割する際、 『ペアの要素1にlist1Aから1Cの90個、要素2にlist2Aからlist2Cの90個』 とあるのですが、そもそも全てのペアは list1A~1C と list2A~2C の組み合わせになっているのではないでしょうか?何を基準に分割したらよいですか?
guest

回答2

0

とりあえず、仕様にそって素直に実装するとこんな感じでしょうか?

Python

1import random 2 3# データ作成 4List1A=["1a{}".format(i+1) for i in range(60)] 5List1B=["1b{}".format(i+1) for i in range(60)] 6List1C=["1c{}".format(i+1) for i in range(60)] 7List2A=["2a{}".format(i+1) for i in range(60)] 8List2B=["2b{}".format(i+1) for i in range(60)] 9List2C=["2c{}".format(i+1) for i in range(60)] 10 11# それぞれのリストをシャッフル 12for d in [List1A,List1B,List1C,List2A,List2B]: 13 random.shuffle(d) 14 15# AとBのリストよりペアリストを作成 16N=20 17listAll = [] 18for i1,d1 in enumerate([List1A,List1B,List1C]): 19 for i2,d2 in enumerate([List2A,List2B,List2C]): 20 listAll.extend(zip(d1[i2*N:i2*N+N],d2[i1*N:i1*N+N])) 21 22# listAllをシャッフル 23random.shuffle(listAll) 24 25# listAllを半分からlistAとlistBに分け、listBはペアの順番を入れ替える 26listA = listAll[:90] 27listB = list(map(lambda d:(d[1],d[0]),listAll[90:])) 28 29print(listA) 30print(listB) 31 32

投稿2017/05/13 03:35

magichan

総合スコア15898

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

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

0

9つのリストに分配する箇所から

とりあえずzip関数を使ってみてはどうでしょうか。
2. 組み込み関数 — Python 3.6.1 ドキュメント

質問追記を受けて追記

自分なら、

  • zip関数を使って9つのリストに分配
  • そのリストを変形して[(1a1, 2a10), list1A2A]の形式に
  • 連結しシャッフル
  • [:90]について要素入れ替え
  • 再シャッフル

という手順で作ると思いますよ!

投稿2017/05/12 09:28

編集2017/05/13 02:14
Lhankor_Mhy

総合スコア36087

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問