python - 您如何将长度较短的列表平均分配到另一个列表?
问题描述
我有两个清单。第一个被命名为位置,它的长度可以从 1 到无穷大不等。
location = ['loc1,'loc2','loc3','loc4,'loc5','loc6','loc7,'loc8','loc9','loc10,'loc11','loc12','loc13,'loc14','loc15','loc16,'loc17','loc18','loc19,'loc20','loc21','loc22,'loc23','loc24','loc25','loc26','loc27',] <- Please note that length could from 1 to infinite number
第二个列表名为audit。它的长度通常大于位置列表的长度。如果甚至没有将第一个或最后一个审核员分配到其他位置,我想将所有审核员平均分配到这些位置。
auditor = ['aone','atwo','athree','afour','afive','asix','aseven','aeight','anine','aten','aeleven','atwelve','athirteen','afourteen','afitheen','asixteen,'aseventeen''] <- Please note that length could from 1 to infinite number
下面的代码在大多数情况下都很好用,但是当位置为 28 且审核员为 17 时它会失败
df2['location'] = location
df2['auditor'] = [auditor[int(df2)] for df2 in np.arange(0, len(auditor), (len(auditor)/len(df2)))]
我想要的输出是获得最可能的均匀划分列表,并且它必须在任何情况下都有效,只要位置大于审计员。
My_desired_output = 'aone'、'aone'、'atwo'、'atwo'、'athree'、'athree'、'afour'、'afour'、'afive'、'afive'、'asix'、'asix'、' aseven','aseven','aeight','aeight','anine','anine','aten','aten','aeleven','aeleven','atwelve','十三','十四' , '十五', '十六岁', '十七岁']
解决方案
您可以考虑使用以下chunked
功能more-itertool
:
from more_itertools import chunked
from math import ceil
from typing import List, Any, Tuple, Iterator
def distribute_evenly(items: List[Any], cells: List[Any]) -> Iterator[Tuple[Any, List[Any]]]:
if len(items) <= len(cells):
item_chunks = [[item] for item in items] + [[]] * (len(cells) - len(items))
else:
chunk_size = int(ceil(len(items) / len(cells)))
item_chunks = chunked(auditor, chunk_size)
return zip(cells, item_chunks)
location = ["loc1", "loc2", "loc3"]
auditor = ["aud1", "aud2", "aud3", "aud4", "aud5", "aud6", "aud7", "aud8"]
auditor_per_location = list(distribute_evenly(auditor, location))
# auditor_per_location is now [('loc1', ['aud1', 'aud2', 'aud3']), ('loc2', ['aud4', 'aud5', 'aud6']), ('loc3', ['aud7', 'aud8'])]
祝你好运!
推荐阅读
- python - MechanicalSoup 在没有按钮的情况下点击链接
- django - Django 全文搜索优化 - Postgres
- python - Pygame 不在 shell 上运行,仅在 _pycache_ 上运行
- css - 如何使装载机居中?
- matlab - 通过matlab GPU调用arrayfun时如何记录循环的迭代变量?
- ibm-mq - 通道中的批量传输速率上限?
- nginx - laravel 5.7 使用 Nginx 重定向
- ruby-on-rails - 在 IntegrationTest Ruby on Rails 中的 assert_select
- rxjs - 每次发射的映射——SwitchMap 保证至少 1 个发射/ConcatMap 混合?
- opencv - opencv3 在 vs2015 上的 Mat::Mat(int ndims, const int* sizes, int type) 构造中失败