質問: [[画像1〜10], [画像11〜20], [画像21〜30], [画像31〜40], [画像41〜50], [画像51〜60]] のように文字列 (3) と画像ファイル (60) ファイルが格納された2つのリストがあるとします。 list1の’あ’はlist2の[画像1〜10]と[画像11〜20]、list1の’い’はlist2の[画像21〜30]と[画像31〜40]、list1の’う’はlist2の[画像41〜50]と[画像51〜60]、とそれぞれ必ず対応するようにします。 この対応付けを元にlist3[a1, a2,...b1, b2,...f59, f60]を作ります。 そして、a1を入力すると文字列’あ’が表示され、さらに何かキーを押すと対応した画像 (1) が出るようにするには、どうすればよいでしょうか。 例えば、 > > 「a1を入力」 > > あ > > 画像1 > > > 「b1を入力」 > > あ > > 画像11 > > > 「c1を入力」 > > い > > 画像21 > > > 「d1を入力」 > > い > > 画像31 > > > 「e1を入力」 > > う > > 画像41 > > > 「f1を入力」 > > う > > 画像51 > > > ようになることが目標です。 多次元配列などにすれば可能でしょうか。
回答: > > a1を入力すると文字列’あ’が表示され、さらに何かキーを押すと対応した画像 (1) が出るようにする... > > > おそらく、list2 には個々の画像のファイルポインタが格納されているのだと思いますが、以下では文字列(ファイル名)だとしておきます。 なお、以下のコードでは termios ライブラリを利用していますので、おそらく UNIX 系 OS 以外では動作しないのではないかと思います。 ``` #!/usr/bin/env python # -*- coding: utf-8 -*- import sys def is_keypressed(): import tty, termios fd = sys.stdin old = termios.tcgetattr(fd) try: tty.setraw(fd) fd.read(1) finally: termios.tcsetattr(fd, termios.TCSAFLUSH, old) def show_item(inp): idx1 = ord(inp[0]) - ord('a') if idx1 < 0 or idx1 > len(list2)-1: print 'No matching.' return try: idx2 = int(inp[1:]) - 1 except ValueError: print 'Illegal input.' return if idx2 < 0 or idx2 > len(list2[idx1])-1: print 'No matching.' return print list1[idx1/2] is_keypressed() print list2[idx1][idx2] if __name__ == '__main__': list1 = [u'あ', u'い', u'う'] list2 = [[u'画像' + str(x+1) for x in range(y*10,(y+1)*10)] for y in range(0,6)] while True: try: # Ignore the rest of key sequence of a function key, arrow key and etc. sys.stdin = open('/dev/tty') inp = raw_input('? ') if inp: show_item(inp) except EOFError: break ```