34819


現在pythonのコードをmatlabに変換しています。以下のコードの解釈がよく分かりませんので、教えていただけると幸いです。コードの内容はrecursive
bisectionとなります。

[code]

    cItems=[8,1,9,7,4,6,3,5,0,2]
    
    cItems=[i[j:k]for i in cItems for j,k in ((0,len(i)/2),(len(i)/2,len(i))) if len(i)>1]
    
[/code]

でcItemsの一文をforループで分解してmatlabコードに変換したいのですが、この部分のpython
のコードがtrickyに組まれておりよく分かりません。ご存知の方いらしましたらご教授ください。


CC BY-SA 3.0
2017-05-18T13:56:40.800
34817
2017-05-21T16:08:22.103
2017-05-18T14:07:07.327
5288
23224
question
python matlab
pythonで1文にfor in が多重ループになっている場合の解釈は？


提示されたコードは動作しませんでした。

とりあえず、文法で解釈して単純に展開すると以下のようになります。  
元のコードはPython2向けのようなので、Python3向けの修正も入れます。

[code]

    cItems = [8,1,9,7,4,6,3,5,0,2]
    
    cItems2 = []
    for i in cItems:
        for j,k in [(0, len(i)//2), (len(i)//2, len(i))]:
            if len(i) > 1:
                cItems2.append(i[j:k])
    
[/code]

もうちょっと展開します

[code]

    cItems = [8,1,9,7,4,6,3,5,0,2]
    
    cItems2 = []
    for i in cItems:
        if len(i) > 1:
            j = 0
            k = len(i) // 2
            cItems2.append(i[j:k])
    
            j = len(i) // 2
            k = len(i)
            cItems2.append(i[j:k])
    
[/code]

展開方法はこんな感じです。  
元コードの正しく動作するものがあれば、同じように展開して構造を理解できるかと思います。


CC BY-SA 3.0
2017-05-18T14:50:37.413
34819
2017-05-18T14:50:37.413
806
34817
answer


recursive bisection という名前から察すると、データの指定が違ってると思います。

[code]

    cItems=[[8,1,9,7,4,6,3,5,0,2]]
    cItems=[i[j:k]for i in cItems for j,k in ((0,len(i)/2),(len(i)/2,len(i))) if len(i)>1]
    
[/code]

これを実行すると

[code]

    [[8, 1, 9, 7, 4], [6, 3, 5, 0, 2]]
    
[/code]

更に実行すると

[code]

    [[8, 1], [9, 7, 4], [6, 3], [5, 0, 2]]
    
[/code]

更に実行すると

[code]

    [[8], [1], [9], [7, 4], [6], [3], [5], [0, 2]]
    
[/code]

更に実行すると

[code]

    [[7], [4], [0], [2]]
    
[/code]

更に実行すると

[code]

    []
    
[/code]

最初の内包表記に適切に改行をいれると読みやすくなります。

[code]

    cItems=[i[j:k]                               # 最終的に並べる項目
            for i in cItems                      # 1番目に行うfor文
            for j, k in ((0, len(i) / 2),        # 2番目に行うfor文、1つ目の j, k
                         (len(i) / 2, len(i)))   #                   2つ目の j, k
            if len(i) > 1]                       # 3番目に行うif文
    
[/code]


CC BY-SA 3.0
2017-05-21T16:00:30.587
34904
2017-05-21T16:08:22.103
2017-05-21T16:08:22.103
14911
14911
34817
answer