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