首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python将值均匀分配到字典中的列表中。

Python将值均匀分配到字典中的列表中。
EN

Stack Overflow用户
提问于 2018-11-04 19:44:46
回答 2查看 2.9K关注 0票数 1

我有以下代码,随机给员工分配数字:

代码语言:javascript
复制
emp_numbers = {}
employees = ['empA', 'empB', 'empC', 'empD', 'empE', 'empF']
numbers = 26
for x in employees:
    emp_numbers[x] = []
emp = list(emp_numbers.keys())

for number in range(1, numbers+1):
    emp_name = choice(emp);
    emp_numbers[emp_name].append(number)
print (emp_numbers)

输出:

代码语言:javascript
复制
{'empA': [4, 25], 'empB': [2, 10, 11, 15, 18, 20, 22, 23], 'empC': [5, 13, 21, 24], 'empD': [3, 6, 7, 8, 12, 16, 19, 26], 'empE': [14], 'EmpF': [1, 9, 17]}

效果很好。然而,我不知道如何使它尽可能均匀地分配数字。有的员工有2个号码,有的有8个号码。有什么建议吗?

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-11-04 19:51:39

假设人数与雇员人数相等,你可以这样做:

代码语言:javascript
复制
import random
import collections


employees = ["empA", "empB", "empC", "empD", "empE", "empF"]  # employee names
numbers = list(range(1, 27))  # numbers from 1..26

emp_numbers = collections.defaultdict(list)  # collects the employee numbers
random.shuffle(numbers)  # shuffle the numbers to distribute

for i, number in enumerate(numbers):  # get the index of the number and the number
    employee = employees[i % len(employees)]  # round-robin over the employees...
    emp_numbers[employee].append(number)  # ... and associate a number with a name.

print(emp_numbers)

产出,如

代码语言:javascript
复制
{'empF': [25, 4, 9, 21], 'empD': [2, 10, 3, 11], 'empE': [18, 5, 17, 15], 'empB': [7, 24, 26, 6, 8], 'empC': [1, 14, 13, 12], 'empA': [16, 23, 20, 19, 22]}

如果数字不均匀可除,一些人会比其他人得到更多的数字。

票数 0
EN

Stack Overflow用户

发布于 2018-11-04 19:55:03

由于您希望分配所有数字,所以可以随机选择数字的顺序,而不是员工:

代码语言:javascript
复制
numbers = list(range(1, 27))
random.shuffle(numbers)

然后,您可以使用切片来获得每个员工的偶数数字:

代码语言:javascript
复制
for idx, employee in enumerate(employees):
    emp_numbers[employee] = numbers[idx::len(employees)]

[start::n]语法选择从start开始的每个n'th项,第一个雇员得到项目0、6、12、.,第二个得到项目1、7、13、.等等。

代码语言:javascript
复制
import random
# initial setup
employees = ['empA', 'empB', 'empC', 'empD', 'empE', 'empF']
numbers = list(range(1, 26+1))
# dict to hold assignment and randomly shuffled numbers
employee_numbers = {}
random.shuffle(numbers)
# assign shuffled numbers to employees
for idx, employee in enumerate(employees):
    employee_numbers[employee] = numbers[idx::len(employees)]
# print result
print(employee_numbers)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53144723

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档