[英]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)]
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.