从字典和列表创建字典

时间:2018-08-08 13:25:37

标签: python list dictionary set

我有字典:

dicocategory = {}
dicocategory["a"] = ["crapow", "Killian", "pauk", "victor"]
dicocategory["b"] = ["graton", "fred"]
dicocategory["c"] = ["babar", "poca", "german", "Georges", "nowak"]
dicocategory["d"] = ["crado", "cradi", "hibou", "distopia", "fiboul"]
dicocategory["e"] = ["makenkosapo"]

和一个列表:

my_list = ['makenkosapo', 'Killian', 'Georges', 'poca', 'nowak']

我想创建一个新字典,将我dicocategory的键作为新键,并将列表中的项作为值。 为了获得新字典的键(删除重复的内容并适应列表),我做了:

def tablemain(my_list ):
    tableheaders = list()
    for value in my_list:
        tableheaders.append([k for k, v in dicocategory.items() if value in v])
    convertlist = [j for i in tableheaders for j in i]
    headerstablefinal = list(set(convertlist))   
    return headerstablefinal

给我:

['e', 'a', 'c']

我的问题是:我不知道如何将列表项放在相应的键中。

编辑: 吼叫我想要的输出

{"a" : ['Killian'], 'c' : ['Georges', 'poca', 'nowak'], 'e' : ['makenkosapo']}

列表my_list可以更改,因此我希望可以创建新词典的内容与列表无关。 如果我的新列表是:

my_list = ['crapow', 'german', 'pauk']

我的输出将是:

{'a':['crapow', 'pauk'], 'c':['german']}

你有什么主意吗? 谢谢

2 个答案:

答案 0 :(得分:2)

您可以使用几个字典理解。计算第一个,然后在第二个中删除交集为空的实例:

my_set = set(my_list)

# calculate intersection
res = {k: set(v) & my_set for k, v in dicocategory.items()}

# remove zero intersection values
res = {k: v for k, v in res.items() if v}

print(res)

{'a': {'Killian'},
 'c': {'Georges', 'nowak', 'poca'},
 'e': {'makenkosapo'}}

更有效地,您可以使用生成器表达式来避免中间字典:

# generate intersection
gen = ((k, set(v) & my_set) for k, v in dicocategory.items())

# remove zero intersection values
res = {k: v for k, v in gen if v}

答案 1 :(得分:0)

您可以获得一个字典,其中仅包含键值与列表相匹配的键,如下所示:

{k:v for k,v in dicocategory.items() if set(v).intersection(set(my_list))}

尽管列表的长度不同,但是您无法将其直接放入DataFrame中。