Madao_2306
@Madao_2306

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

2次元リストの抽出について

解決したいこと

2次元リストで下記2点を行いたいと考えているのですが、
②の方法が分からず...ご教示いただけないでしょうか。

①2次元リストの1行目から、重複しないようにランダムで要素を5つ抽出
②作業①で抽出した要素と同列の、2行目の要素を同様に5つ抽出

発生している問題・エラー

②の方法が分からない。

自分で試したこと

①については、下記方法で抽出した。

import random

LIST = [
    ["りんご", "本", "猫", "犬", "卵", "魚", "男の子", "女の子"],  
    ["apple", "book", "cat", "dog", "egg", "fish", "boy", "girl"],  
]
JPN = random.sample(LIST[0], 5) 

補足

pythonで日本語と英語の一問一答ゲームを作っています。
下記ベースにしている一問一答のプログラムがあり、これに全体から5つ問題をランダムに抽出して答えさせる形式に変更したいと考えています。

JPN = ["りんご", "本", "猫", "犬", "卵", "魚", "男の子", "女の子"]
ENG = ["apple", "book", "cat", "dog", "egg", "fish", "boy", "girl"]
n = len(JPN)
for i in range(n):
    a = input(JPN[i] + "は英語でなんて言う?")
    if a == ENG[i]:
        print("正解!")
    else:
        print("残念!答えは" + ENG[i])
0

3Answer

JPNの各要素がLIST[0]内の何番目に現れるかを調べて、LIST[1]の対応する要素を取り出せば、②を実現することは可能ではあります。

ENG = [LIST[1][LIST[0].index(j)] for j in JPN]

ただ、そうするよりは、日本語と英語のペアを作ったあとで、ランダムに要素を抽出する方が楽です。

for jpn, eng in random.sample([*zip(*LIST)], 5):
    print(jpn, eng)
3Like

Comments

  1. @Madao_2306

    Questioner

    ありがとうございます!
    index用いて試したところ上手くいきました!
    また提案いただいたBetter な方法も試してみました、使いやすかったです!

リストからランダムに一つだけ選ぶなら、
#list = [z for z in zip(LIST[0], LIST[1])]
list = [*zip(*LIST)]  # @actorbug さんの書き方に倣うともっとシンプルに書けました
print(random.choice(list))
リストからランダムに5つ選ぶなら、
#list = [z for z in zip(LIST[0], LIST[1])]
list = [*zip(*LIST)]  # @actorbug さんの書き方に倣うともっとシンプルに書けました
print(random.sample(list, len(list))[:5])
2Like

ix = random.sample(range(len(LIST[0]), 5))

センスがなくてごめんなさい。

上記を内包表記で、リスト形式で出力するのもありですね。
[["りんご","apple"], ["本", "book"], ... ]

ゲームの内容から辞書型の内包表記が良いかも。近くの質問参照

1Like

Comments

  1. @Madao_2306

    Questioner

    ありがとうございます、辞書型内包表記というのがあるんですね!
    初学者なので少し理解に時間がかかるかもですが、この後すぐ試してみます!

Your answer might help someone💌