簡體   English   中英

當 Python 中的值總和為 n 時,如何對列表中的元素求和並使用它們創建子列表

[英]How to sum elements from a List and create sublist with them when they sum to a value of n in Python

我有點卡住了。

所以這是我的場景。

我有一個小文件列表(鑲木地板文件)。 我的目標是跟蹤它們並將它們合並為更優化的鑲木地板文件大小。

雖然我可以讀取所有內容並運行重新分區,但這不適用於我的用例,因為它們與其他已分區的文件共享位置(就數據量而言,需要處理很多)。

所以我有列表看起來像這樣:

[
[('filepath.parquet',1000),
('filepath.parquet',1000)],

[('filepath.parquet',1000),
('filepath.parquet',1000),
('filepath.parquet',1000),
('filepath.parquet',1000),
('filepath.parquet',1000),
('filepath.parquet',1000),
('filepath.parquet',1000),
('filepath.parquet',1000)],

 [('filepath.parquet',1000),
('filepath.parquet',1000),
('filepath.parquet',1000),
('filepath.parquet',1000),
('filepath.parquet',1000),
('filepath.parquet',1000),
('filepath.parquet',1000),
('filepath.parquet',1000),
('filepath.parquet',1000),
('filepath.parquet',1000),
('filepath.parquet',1000)]
]

我的目標是擁有最大組大小參數,該參數將根據字節總和創建此列表的子列表。

使用我的列表示例,max_group 為 5000,其中我有一個帶有 3 個子列表的主列表,我會得到:

1 - 主列表- 此處沒有變化1 - 子列表 1 將保留其所有元素,因為字節的總和僅為 2000 2 - 子列表 2 將被拆分為 2 個子子列表,因為總和為 8000,max_group 為 5000 .例如:

[('filepath.parquet',1000),
('filepath.parquet',1000),
('filepath.parquet',1000),
('filepath.parquet',1000),
('filepath.parquet',1000)],

[('filepath.parquet',1000),
('filepath.parquet',1000),
('filepath.parquet',1000)]
  • 所以一個子子列表將是 5000,另一個將是 3000

3 - 子列表 3 - 將分為 3 個子子列表,如下所示,再次遵循相同的 max_group

[('filepath.parquet',1000),
('filepath.parquet',1000),
('filepath.parquet',1000),
('filepath.parquet',1000),
('filepath.parquet',1000)],

[('filepath.parquet',1000),
('filepath.parquet',1000),
('filepath.parquet',1000),
('filepath.parquet',1000),
('filepath.parquet',1000)],

[('filepath.parquet',1000)]

 

所以我的最終名單是:

[ -- main list
    [ -- sub list 
            [ -- sub sub list
            ('filepath.parquet',1000),
            ('filepath.parquet',1000)
            ],

            [
            ('filepath.parquet',1000),
            ('filepath.parquet',1000),
            ('filepath.parquet',1000),
            ('filepath.parquet',1000),
            ('filepath.parquet',1000)
            ],

            [
            ('filepath.parquet',1000),
            ('filepath.parquet',1000),
            ('filepath.parquet',1000)
        ]
    ],

    [
            [
            ('filepath.parquet',1000),
            ('filepath.parquet',1000),
            ('filepath.parquet',1000),
            ('filepath.parquet',1000),
            ('filepath.parquet',1000)
            ],

            [
            ('filepath.parquet',1000),
            ('filepath.parquet',1000),
            ('filepath.parquet',1000),
            ('filepath.parquet',1000),
            ('filepath.parquet',1000)
            ],
    ],
    [
            [
            ('filepath.parquet',1000)
            ]
    ]
]

所以我試圖在 python 中執行此操作:我的代碼:

lst = [
[('filepath.parquet',1000),
('filepath.parquet',1000)],

[('filepath.parquet',1000),
('filepath.parquet',1000),
('filepath.parquet',1000),
('filepath.parquet',1000),
('filepath.parquet',1000),
('filepath.parquet',1000),
('filepath.parquet',1000),
('filepath.parquet',1000)],

 [('filepath.parquet',1000),
('filepath.parquet',1000),
('filepath.parquet',1000),
('filepath.parquet',1000),
('filepath.parquet',1000),
('filepath.parquet',1000),
('filepath.parquet',1000),
('filepath.parquet',1000),
('filepath.parquet',1000),
('filepath.parquet',1000),
('filepath.parquet',1000)]
]
    
    
max_group  = 5000
i = 0
for k,sublst in enumerate(lst):
    print('entering sublst: ' + str(k))
    for file in sublst:
        f, v = file
        tot = i + v
        print(f)
        while tot <= max_group:
            tot = tot + v

在這里,您嘗試迭代 v 這是一個 integer 並得到一個總和。 下面是求和法。

def sum(*args, **kwargs): # real signature unknown
    """
    Return the sum of a 'start' value (default: 0) plus an iterable of numbers
    
    When the iterable is empty, return the start value.
    This function is intended specifically for use with numeric values and may
    reject non-numeric types.
    """
    pass

您需要將數組傳遞給 sum 方法。

以下代碼將為您提供預期的解決方案。

max_group = 5000
i = 0
final_list = []
for k, sublst in enumerate(lst):
    print('entering sublst: ' + str(k))
    size = 0
    temp_list = []
    for file in sublst:
        f, v = file
        size += v

        if size > max_group:
            final_list.append(temp_list)
            temp_list = [file]
            size = v
        else:
            temp_list.append(file)

    if len(temp_list) > 0:
        final_list.append(temp_list)

首先,它將 append 的 v 到大小,但它不會 append f 到列表。 如果大小大於 max_group,則 temp_list 將附加到 final_list 並使用文件初始化 temp_list。 然后它也會重新初始化大小。 如果大小小於 max_group,它將繼續附加到 temp_list。 在 for 循環結束時,它將檢查 temp_list 的長度,如果 temp_list 中有剩余元素,則臨時列表也將附加到 final_list 中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM