Python 如何从两个列表中的随机值创建字典?

Python 如何从两个列表中的随机值创建字典?,python,pandas,macos,dataframe,Python,Pandas,Macos,Dataframe,上下文:我有两个大小不等的列表姓名包含家庭成员的姓名,家务事包含更长的家务事列表。我正在编写一个程序,随机将每个家务分配给一个家庭成员,这样每个人都可以得到相同数量的家务(或者至少+1/-1)。我想到了一些可能的方法,至少在理论上是这样。一种方法是简单地将家务清单,将清单均匀地分成n个新清单,然后将其中一个较小的清单分配给每个家庭成员。我还可以循环浏览家务清单,在每次通过时为每个家庭成员分配家务,直到所有家务都分配给一个家庭成员 我很难找到具体的操作或例子来帮助解决这个问题;有一个具体的工作流程

上下文:我有两个大小不等的列表<代码>姓名包含家庭成员的姓名,
家务事
包含更长的家务事列表。我正在编写一个程序,随机将每个家务分配给一个家庭成员,这样每个人都可以得到相同数量的家务(或者至少+1/-1)。我想到了一些可能的方法,至少在理论上是这样。一种方法是简单地将
家务清单
,将清单均匀地分成
n
个新清单,然后将其中一个较小的清单分配给每个家庭成员。我还可以循环浏览家务清单,在每次通过时为每个家庭成员分配家务,直到所有家务都分配给一个家庭成员

我很难找到具体的操作或例子来帮助解决这个问题;有一个具体的工作流程我应该考虑吗?

< P>这里有一种方式:

import random
names = ['John', 'Ashley', 'Debbie']
chores = ['cook', 'clean', 'shop', 'pay bills', 'wash car', 'mow lawn', 'walk dog', 'drive kids']

ratio = len(chores)//len(names)
assignments = {}
for name in names:
    assignments[name] = random.sample(chores, ratio)

print(assignments)

#{'John': ['mow lawn', 'pay bills'], 'Ashley': ['cook', 'walk dog'], 'Debbie': ['mow lawn', 'shop']}
如果您希望分配所有杂务,而不希望重复杂务,以下是一个解决方案:

import random
names = ['John', 'Ashley', 'Debbie']
chores = ['cook', 'clean', 'shop', 'pay bills', 'wash car', 'mow lawn', 'walk dog', 'drive kids']

random.shuffle(chores)
chunck = len(chores)//len(names)
remainder = len(chores)%len(names)

#distribute even chunks of chores amongst names
assignments = {}
for idx, name in enumerate(names):
    assignments[name] = chores[idx*chunck: idx*chunck+chunck]

#distribure remaining chores amongst names
if remainder != 0:
    remaining_chores = chores[-remainder:]
    for i in range(len(remaining_chores)):
        assignments[names[i]] += [remaining_chores[i]]
    
print(assignments)

从pakpe的答案中窃取的设置:

import random

names = ['John', 'Ashley', 'Debbie']
chores = ['cook', 'clean', 'shop', 'pay bills', 'wash car', 'mow lawn', 'walk dog', 'drive kids']
解决方案1,平均分配家务:

random.shuffle(names)
random.shuffle(chores)
assignments = {name: chores[i::len(names)]
               for i, name in enumerate(names)}
样本结果:

{'Debbie': ['wash car', 'clean', 'shop'],
 'Ashley': ['walk dog', 'mow lawn', 'cook'],
 'John': ['drive kids', 'pay bills']}
{'Debbie': ['mow lawn', 'pay bills', 'shop', 'cook'],
 'Ashley': [],
 'John': ['wash car', 'walk dog', 'drive kids', 'clean']}
解决方案2,可能稍微简单但不均匀(在他们更改问题之前发布):

样本结果:

{'Debbie': ['wash car', 'clean', 'shop'],
 'Ashley': ['walk dog', 'mow lawn', 'cook'],
 'John': ['drive kids', 'pay bills']}
{'Debbie': ['mow lawn', 'pay bills', 'shop', 'cook'],
 'Ashley': [],
 'John': ['wash car', 'walk dog', 'drive kids', 'clean']}

(第一次尝试,阿什利真的很幸运。)

你可以使用
zip
+
循环
zip\u最长
,根据你的家务活是少还是人少,将人与家务事配对。如果你的家务活比人多,这仍然会创建一个所有人的数据框,有些人的家务活是
None

import pandas as pd
from itertools import cycle, zip_longest
from random import shuffle

names = ['John', 'Ashley', 'Debbie']
chores = ['cook', 'clean', 'shop', 'pay bills', 'wash car', 'mow lawn', 'walk dog', 'drive kids']


“最简单”的方法是简单地将所有家务分配给你最讨厌的家庭成员,并声称“运气不好”…顺便说一句,我建议提供测试示例数据的家务应由你完成。哦,回答标题问题:是的,当然可能。这就把标题弄得乱七八糟了。@Manuel所有的评论都让你泪流满面。我想我没有要求任何人提供他们自己的样本数据。我在这里不知所措,并且很困惑为什么这个问题被关闭了。更不用说在我们已经找到一个可行的解决方案后关闭它了。如果问题真的需要额外的“细节或清晰度”,我们就不会找到解决方案。由于我们有了一个可行的解决方案,多亏了这些出色的贡献者,我不打算编辑或删除这个对其他人有价值的问题。。。您的输出中似乎缺少八个“家务”中的两个,“割草”在输出中出现两次,但在家务列表中仅出现一次。@HoganMarhoefer查看我的修订答案。关于第二个解决方案:可怜的John,总是第一个(甚至可能是唯一一个)得到剩余家务。不公平。@Manuel我更新了答案,并用零余数解决了问题。@Nick我认为最好把所有人都包括在这条命令中。说得好,我应该考虑到Ashley可能会再次走运!:)如果我不清楚,我很抱歉,但是家务活需要尽可能均匀地分配!对不起,但是没有人会不做一些家务就离开的@Manuel可以为每个家庭成员设定一个最低家务数量,即家务数量除以家庭成员数量的商?@HoganMarhoefer,当然可以,但为什么?解决方案1已经实现了这一点。
df.groupby('name').chore.agg(list)
#name
#Ashley              [wash car, cook, clean]
#Debbie                     [shop, mow lawn]
#John      [walk dog, drive kids, pay bills]
#Name: chore, dtype: object