Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 按键的值分组,其中值可以是列表_Python - Fatal编程技术网

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”循环中内联编写它循环。可能应该添加一个简短的文本您缺少的是-说明用户代码不工作的原因-并修复该问题。给出简短的解释可能应该添加一个简短的文本您缺少的是-说明用户代码不工作的原因-并修复该问题。给出简短的解释工作得很好。谢谢工作得很好。谢谢