Python 按键的值分组,其中值可以是列表
因此,我尝试将以下对象分组:Python 按键的值分组,其中值可以是列表,python,Python,因此,我尝试将以下对象分组: staffs={ "James":["basket_ball","swimming"], "Cook":"swimming", "Peter":"basket_ball", "Ben":"coding", "Joe":"coding" } 其中,预期输出应为: { "basket_ball": ["James","Peter"], "swimming":["Cook","James"], "codin
staffs={
"James":["basket_ball","swimming"],
"Cook":"swimming",
"Peter":"basket_ball",
"Ben":"coding",
"Joe":"coding"
}
其中,预期输出应为:
{
"basket_ball": ["James","Peter"],
"swimming":["Cook","James"],
"coding":["Ben", "Joe"]
}
以下是我所做的:
def group_by_hobby(staffs):
hobbies = staffs.values()
obj = {}
for h in hobbies:
if(isinstance(h, list)):
for i in h:
obj[i] = [k for k in staffs.keys() if staffs[k] == h]
else:
obj[h] = [k for k in staffs.keys() if staffs[k] == h]
print(obj)
但不考虑值为list的键。我甚至添加了一个检查,如果它是一个列表,循环通过它并分离值,但似乎不起作用。你知道我在这里遗漏了什么吗
对于这个解释,我深表歉意,Python还是新手。您需要附加到数组,而不是在生成的obj中替换它们:
def group_by_hobby(staffs):
obj = {}
for person in staffs.keys():
hobbies = staffs[person]
print('hobbies: {}'.format(hobbies))
if(isinstance(hobbies, list)):
for hobby in hobbies:
if hobby not in obj.keys():
obj[hobby] = []
print(hobby)
obj[hobby].append(person)
else:
if hobbies not in obj.keys():
obj[hobbies] = []
obj[hobbies].append(person)
print(obj)
您需要附加到阵列,而不是在生成的obj中替换它们:
def group_by_hobby(staffs):
obj = {}
for person in staffs.keys():
hobbies = staffs[person]
print('hobbies: {}'.format(hobbies))
if(isinstance(hobbies, list)):
for hobby in hobbies:
if hobby not in obj.keys():
obj[hobby] = []
print(hobby)
obj[hobby].append(person)
else:
if hobbies not in obj.keys():
obj[hobbies] = []
obj[hobbies].append(person)
print(obj)
如果你知道会有什么爱好,你可以简单地做:
职员={
“詹姆斯”:[“篮球”、“游泳”],
“厨师”:[“游泳”],
“彼得”:[“篮球”],
“本”:[“编码”],
“Joe”:[“编码”]
}
爱好={
“篮球”:[],
“游泳”:[],
“编码”:[]
}
对于键,以staff.items()表示的值:
对于价值爱好:
嗜好[嗜好].附加(键)
印刷品(爱好)
如果你知道会有什么爱好,你可以简单地做:
职员={
“詹姆斯”:[“篮球”、“游泳”],
“厨师”:[“游泳”],
“彼得”:[“篮球”],
“本”:[“编码”],
“Joe”:[“编码”]
}
爱好={
“篮球”:[],
“游泳”:[],
“编码”:[]
}
对于键,以staff.items()表示的值:
对于价值爱好:
嗜好[嗜好].附加(键)
印刷品(爱好)
首先,您需要一个函数来获取爱好列表:
def get_嗜好(str_或_列表):
如果存在(str_或_list,str),则返回[str_或_list],否则返回str_或_list
然后,您可以使用创建列表字典:
result=collections.defaultdict(列表)
对于名称,staff\u staff.items()中的爱好:
对于get_嗜好(员工嗜好)中的嗜好:
结果[hobby]。追加(名称)
你得到你想要的:
defaultdict(,{'basket_ball':['James','Peter'],'sweeling':['James','Cook'],'coding':['Ben','Joe']})
首先,您需要一个函数来获取爱好列表:
def get_嗜好(str_或_列表):
如果存在(str_或_list,str),则返回[str_或_list],否则返回str_或_list
然后,您可以使用创建列表字典:
result=collections.defaultdict(列表)
对于名称,staff\u staff.items()中的爱好:
对于get_嗜好(员工嗜好)中的嗜好:
结果[hobby]。追加(名称)
你得到你想要的:
defaultdict(,{'basket_ball':['James','Peter'],'sweeling':['James','Cook'],'coding':['Ben','Joe']})
对于dict中的每个项目,如果dict项目的值是一个列表,则您可以重复使用嗜好,或者通过创建一个项目列表将其列为一个列表。使用dict.setdefault
方法用新列表初始化每个不存在的dict键:
output = {}
for name, hobbies in staffs.items():
for hobby in hobbies if isinstance(hobbies, list) else [hobbies]:
output.setdefault(hobby, []).append(name)
输出
变为:
{'basket_ball': ['James', 'Peter'], 'swimming': ['James', 'Cook'], 'coding': ['Ben', 'Joe']}
对于dict
dict中的每个项目,如果dict项目的值是一个列表,则您可以迭代嗜好,或者通过创建一个单项目列表使其成为一个列表。使用dict.setdefault
方法用新列表初始化每个不存在的dict键:
output = {}
for name, hobbies in staffs.items():
for hobby in hobbies if isinstance(hobbies, list) else [hobbies]:
output.setdefault(hobby, []).append(name)
输出
变为:
{'basket_ball': ['James', 'Peter'], 'swimming': ['James', 'Cook'], 'coding': ['Ben', 'Joe']}
代码的问题是,即使键的值已经存在,也要再次将新列表指定给键,请使用此修改在列表中追加,而不是指定新值
您可以使用以下选项:
def group_by_hobby(staffs):
hobbies = staffs.values()
print hobbies
obj = {}
for h in hobbies:
if(isinstance(h, list)):
for i in h:
if i not in obj:
obj[i] = []
obj[i] = obj[i]+[k for k in staffs.keys() if staffs[k] == h]
else:
if h not in obj:
obj[h] = []
obj[h] = obj[h]+[k for k in staffs.keys() if staffs[k] == h]
print obj
代码的问题是,即使键的值已经存在,也要再次将新列表指定给键,请使用此修改在列表中追加,而不是指定新值
您可以使用以下选项:
def group_by_hobby(staffs):
hobbies = staffs.values()
print hobbies
obj = {}
for h in hobbies:
if(isinstance(h, list)):
for i in h:
if i not in obj:
obj[i] = []
obj[i] = obj[i]+[k for k in staffs.keys() if staffs[k] == h]
else:
if h not in obj:
obj[h] = []
obj[h] = obj[h]+[k for k in staffs.keys() if staffs[k] == h]
print obj
这是完成工作的另一种方式:
staffs={
"James":["basket_ball","swimming"],
"Cook":"swimming",
"Peter":"basket_ball",
"Ben":"coding",
"Joe":"coding"
}
hobbies = dict()
for x in staffs.values():
for y in x if isinstance(x, list) else [x]:
hobbies[y] = []
for x in staffs.keys():
for y in staffs[x] if isinstance(staffs[x], list) else [staffs[x]]:
hobbies[y].append(x)
print(hobbies)
这是完成工作的另一种方式:
staffs={
"James":["basket_ball","swimming"],
"Cook":"swimming",
"Peter":"basket_ball",
"Ben":"coding",
"Joe":"coding"
}
hobbies = dict()
for x in staffs.values():
for y in x if isinstance(x, list) else [x]:
hobbies[y] = []
for x in staffs.keys():
for y in staffs[x] if isinstance(staffs[x], list) else [staffs[x]]:
hobbies[y].append(x)
print(hobbies)
您的数据不一致:有时您有list
,有时您有str
。你能把你的数据转换成列表的字典吗?if staff[k]==h
应该是if staff[k]==i
在你分配obj[i]
的行中,实际输出是什么?为什么期望“游泳”:[“库克”,“詹姆斯”
,而不是“游泳”:[“詹姆斯”,“库克”]
?您的数据不一致:有时您有列表
,有时您有str
。你能把你的数据转换成列表的字典吗?if staff[k]==h
应该是if staff[k]==i
在你分配obj[i]
的行中,实际输出是什么?为什么期望“游泳”:[“库克”,“詹姆斯”
,而不是“游泳”:[“詹姆斯”,“库克”
?他们“需要”那个函数?你可以使用一个函数来分离关注点,但是你也可以在第二个“for”循环中内联编写它。他们“需要”那个函数?你可以使用一个函数来分离关注点,但是你也可以在第二个“for”循环中内联编写它循环。可能应该添加一个简短的文本您缺少的是-说明用户代码不工作的原因-并修复该问题。给出简短的解释可能应该添加一个简短的文本您缺少的是-说明用户代码不工作的原因-并修复该问题。给出简短的解释工作得很好。谢谢工作得很好。谢谢