61639


二次元配列Bの要素を一つずつ読み込んで以下の処理を行いたいです。  
書き方が分からない行は疑問点１、疑問点２としてコメントアウトしてあります。

[code]

    A = [['apple', 1],['banana', 2],['orange', 3],['grape', 4]]
    B = [['apple', 'ringo'],['banana', 'banana'],['orange', 'orenji'],['grape', 'budou']]
    
    #(疑問点１)Bの０番目の要素（['apple', 'ringo']）をCとして取り出す方法
    #C = ['apple', 'ringo']
    
    result = []
    while C:
            for m in range(len(A)):
                if A[m][0] == C[0]:
                    a = []
                    a.append(A[m]) 
                    a.append(C[1]) 
    
                     result.append(a) 
                    #（疑問点２）Aの１番目の要素を読み込む式
    
[/code]

上のような処理をして以下の結果を得たいと考えています。

[code]

    result = [['apple', 1, 'ringo'],['banana', 2, 'banana'],['orange', 3, 'orenji'],['grape', 4, 'budou']]
    
[/code]

書き方が分からない箇所が２つ（疑問点１と疑問点２）あり、どのように書いたら良いか教えていただきたいです。  
よろしくお願いいたします。


CC BY-SA 4.0
2019-12-21T04:35:37.770
61638
2019-12-21T05:58:36.507
2019-12-21T04:58:06.420
36978
36978
question
python
二次元配列の要素を一つずつ読み込んで処理をしたい


### Q1. Bの０番目の要素（['apple', 'ringo']）をCとして取り出す方法

B[0]によってBの0番目の要素を取り出す事ができます。

[code]

    >>> C = B[0]
    
[/code]

しかし文意を見る限り、欲しいのは0番目の要素だけではなくBの要素を順に処理したいように見えます（ですよね？）。それなら素直にfor文を使った方がいいでしょう。

### Q2. Aの１番目の要素を読み込む式

本当に必要なのはAの要素(D)の中の1番目の要素。

[code]

    result = []
    for C in B:
        # 同様にAのループもfor文で取り出す。
        # DはAの要素のひとつ。
        for D in A:
            if D[0] == C[0]:
                a = []
                a.append(C[0])
                a.append(D[1])
                a.append(C[1])
                result.append(a)
    
    print(result)
    
[/code]

`while` を使ってもできなくは無いけど、操作が破壊的になるから素直にfor使っとくのがいいと思うよ。

[code]

    result_while = []
    
    tmp_b = B.copy()
    while tmp_b:
        C = tmp_b.pop(0)  # tmp_bの最初の要素を削る
    
        tmp_a = A.copy()
        while tmp_a:
            D = tmp_a.pop(0)
    
            if D[0] == C[0]:
                a = []
                a.append(C[0])
                a.append(D[1])
                a.append(C[1])
                result_while.append(a)
    
    print(result_while)
    
[/code]

効果的にやるなら、まずAを辞書にしておくかな。

[code]

    idx_of = {x[0]: x[1] for x in A}  # idx_of['apple'] で1が取れるようになる。
    
[/code]

そうすればif文も要らない。

[code]

    result_dict = []
    for C in B:
        result_dict.append([C[0], idx_of[C[0]], C[1]])
    
    print(result_dict)
    
[/code]

これぐらい短くなれば内包表記のメリットが生きてくる。

[code]

    result_lc = [[x[0], idx_of[x[0]], x[1]] for x in B]
    print(result_lc)
    
[/code]


CC BY-SA 4.0
2019-12-21T05:58:36.507
61639
2019-12-21T05:58:36.507
62
61638
answer