91247


slice_list_dataとdict_dataのデータがあります。

slice_list_data→スライス値が含まれた空配列のリスト  
dict_data→各keyに配列の要素が含まれた辞書

こちらのリストに辞書内のデータを格納したいのですが、思った通りの格納が出来ない状態です。  
もし、お分かりの方がいましたら、教えて頂けますと幸いです。

[code]

    # 自身の出力結果
    [[1, 2, 3, 4]
    [5, 6]
    [7, 8, 9]
    [1, 2]
    [3]
    [1, 2]
    [3, 4]
    [5]
    [1, 2, 3, 4]
    [5, 6]
    [7]
    [1]
    [1, 2, 3]]
    
    # 期待する出力結果
    [[1, 2, 3, 4],
     [5, 6],
     [7, 8, 9],
     [1, 2], 
     [3], 
     [1, 2], 
     [3, 4, 5], 
     [1, 2], 
     [3, 4, 5, 6], 
     [7], 
     [1], 
     [1, 2],  
     [3]]
    
[/code]

現在は、リストの5番目までは期待する結果になるのですが、  
それ以降は思いつかない状態です。

よろしくお願い致します。

現状試したコードを下記に記載します。

[code]

    slice_list_data = [[[[], 0, 4], [[], 4, 6], [[], 6, 10], [[], 10, 12]],
                 [[[], 0, 4], [[], 4, 6], [[], 6, 10], [[], 10, 12]],
                 [[[], 0, 4], [[], 4, 6], [[], 6, 10], [[], 10, 12]],
                 [[[], 0, 4], [[], 4, 6], [[], 6, 10], [[], 10, 12]],
                 [[[], 0, 4], [[], 4, 6], [[], 6, 10], [[], 10, 12]],
                 [[[], 0, 4], [[], 4, 6], [[], 6, 10], [[], 10, 12]]]
    
    dict_data = {1: [1, 2, 3, 4, 5, 6, 7, 8, 9],
                 2: [1, 2, 3],
                 3: [1, 2, 3, 4, 5],
                 4: [1, 2, 3, 4, 5, 6, 7],
                 5: [1],
                 6: [1, 2, 3]}
    
    
    # ここで各keyに格納されている要素を、指定した値まで各配列に格納
    temp_list = []
    for list_num, i in enumerate(list_data):
        for list_idx, j in enumerate(i):
            temp_list.append([])
            temp_list[list_num].append(dict_data[list_num+1][j[1]:j[2]])
            
    value_only_list = [ j for i in temp_list for j in i if j != [] ]
    
    # 指定した値をvalue_only_listの要素数分追加する
    # 例: [4, 2, 4, 2, 4, 2,・・・・, 4, 2, 4, 2]
    upper_limit_list = []
    
    count = 0
    while True:
        for i in num_list:
            upper_limit_list.append(i)
            
        count += len(num_list)
        
        if count > len(value_only_list*n_val):
            break
            
    # ここでは、指定した値分配列に格納されてるか確認、もし超えていた場合、再度詰め直し
    for idx, (x, y) in enumerate(zip(upper_limit_list, value_only_list)):
        if len(y) > x:
            value_only_list[idx] = y[:x]
            value_only_list.insert(idx+1, y[x:])
            
            
    # 出力結果確認
    for x in value_only_list:
        print(x)
        
        
    # 期待する出力結果
    result = [[1, 2, 3, 4],
     [5, 6],
     [7, 8, 9],
     [1, 2], 
     [3], 
     [1, 2], 
     [3, 4, 5], 
     [1, 2], 
     [3, 4, 5, 6], 
     [7], 
     [1], 
     [1, 2],  
     [3]]
    
    
    print('期待する出力結果', result)
    
[/code]


CC BY-SA 4.0
2022-09-20T09:37:43.833
91196
2022-09-23T02:04:27.520
2022-09-20T09:42:13.360
3060
47752
question
python python3
指定した上限値の値分、各配列に要素を追加する


これは質問に対する回答ではなく  
質問に記載されているコードが動かなかったための, 変更です

もとの`upper_limit_list` の代わりに `iter(cycle())` を使用  
(質問を改訂する場合などに, もしも参考になるような部分があればどうぞ)

[code]

    from itertools import cycle
    import pprint
    
    slice_list_data = [
        [[[], 0, 4], [[], 4, 6], [[], 6, 10], [[], 10, 12]],
        [[[], 0, 4], [[], 4, 6], [[], 6, 10], [[], 10, 12]],
        [[[], 0, 4], [[], 4, 6], [[], 6, 10], [[], 10, 12]],
        [[[], 0, 4], [[], 4, 6], [[], 6, 10], [[], 10, 12]],
        [[[], 0, 4], [[], 4, 6], [[], 6, 10], [[], 10, 12]],
        [[[], 0, 4], [[], 4, 6], [[], 6, 10], [[], 10, 12]]]
    
    dict_data = {1: [1, 2, 3, 4, 5, 6, 7, 8, 9],
                 2: [1, 2, 3],
                 3: [1, 2, 3, 4, 5],
                 4: [1, 2, 3, 4, 5, 6, 7],
                 5: [1],
                 6: [1, 2, 3]}
    
    # dict_data の内容から, slice_list_data による抜き出し
    value_only_list = []
    for p, row in enumerate(slice_list_data):
        for col in row:
            v = dict_data[p +1][col[1]: col[2]]
            if v: value_only_list.append(v)
    
    # 指定の長さより長い項目は, さらに分割
    it = iter(cycle((4,2)))
    res = []
    for v in value_only_list:
        sz = next(it)
        #print(v, sz)
        while len(v) > sz:
            res.append(v[:sz])
            v = v[sz:]
            sz = next(it)
    
        if v: res.append(v)
    
    # 中間結果, 最終結果
    pprint.pprint(value_only_list)
    pprint.pprint(res)
    
[/code]

* * *

【問題点】(コメントから転載)  
前半で`value_only_list`生成し, 後半で `[4,2]*n` のサイズ毎にさらに分割してるようで, 合成してる処理は無さそう。  
なので `[1, 2, 3, 4], [5, 6], [7, 8, 9],` のように分割され, 「期待する出力結果」のように `[3, 4, 5]`
(5が途中に) が現れることは無いのでは？


CC BY-SA 4.0
2022-09-22T09:21:20.930
91240
2022-09-22T09:21:20.930
43025
91196
answer


自己解決

[code]

    # そもそものデータ構成変更
    data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 6, 7, 1, 1, 2, 3]
    num_list = [4, 2, 4, 2]
    
    num_list2 = []
    
    count = 0
    while True:
        for i in num_list:
            num_list2.append(i)
            
        count += len(num_list)
            
        if count >= len(data):
            
            break
            
            
    data[0] = 0
    
    tmp_list = [[]]
    
    data_idx = 0
    list_idx = 0
    
    # 下記処理でデータの中身一つずつ確認して空リストに格納する
    while data_idx < len(data):
        target_val = data[data_idx]
        storage_list = num_list2[list_idx]
    
        if target_val == 1 or len(tmp_list[list_idx]) == storage_list:
            list_idx += 1
            tmp_list.append([])
    
        tmp_list[list_idx].append(target_val)
    
        data_idx += 1
            
            
    tmp_list
    
[/code]


CC BY-SA 4.0
2022-09-23T02:04:27.520
91247
2022-09-23T02:04:27.520
47752
91196
answer