Python-在循环中重新构造lits字典

Python-在循环中重新构造lits字典,python,list,loops,dictionary,for-loop,Python,List,Loops,Dictionary,For Loop,嗨,伙计们,我有一个dict id_dict,里面有一些钥匙。在该键中,有作为值的列表(有时只有一项,有时是4项)。(这些是组件的名称) my dict id_dict是动态创建的,键和值总是会更改。您实际上是在尝试将正在迭代的组件列表分配为字典的键,这将导致错误。 试着简单地做: component_dict[component] = id 也许可以尝试以下方式: new_dic = {} for k, v in dic.items(): for ele i

嗨,伙计们,我有一个dict id_dict,里面有一些钥匙。在该键中,有作为值的列表(有时只有一项,有时是4项)。(这些是组件的名称)


my dict id_dict是动态创建的,键和值总是会更改。

您实际上是在尝试将正在迭代的组件列表分配为字典的键,这将导致错误。 试着简单地做:

            component_dict[component] = id

也许可以尝试以下方式:

new_dic = {}

for k, v in dic.items():
    for ele in v:
        if ele not in new_dic:
            new_dic[ele] = []
        new_dic[ele].append(k)
new_dic

注意追加

似乎u调用的是
组件
而不是
组件
,并且不能是dict键,这是导致错误的原因, 此外,您没有将其设置为列表,只是分配了值,您需要分配一个不存在的列表,如果它存在,则附加到该列表

因此:

输出:

{'crypto': ['G', 'M'], 'update': ['T', 'F', 'M'], 'monitor': ['T'], 'ipforum': ['T']}
试试这个

from collections import defaultdict

d = {'G': ['crypto'], 'T': ['update', 'monitor', 'ipforum'], 'F': ['update'], 'M': ['crypto', 'update']}
d1 = defaultdict(list)
for k, v in d.items():
    for x in v:
        d1[x].append(k)
print(d1)
输出

defaultdict(<class 'list'>, {'crypto': ['G', 'M'], 'update': ['T', 'F', 'M'], 'monitor': ['T'], 'ipforum': ['T']})
defaultdict(,{'crypto':['G','M'],'update':['T','F','M'],'monitor':['T'],'ipforum':['T']})

最简单的方法是使用collections.defaultdict-这将使您免于多次测试

from collections import defaultdict
source = {'G': ['crypto'], 
          'T': ['update', 'monitor', 'ipforum'], 
          'F': ['update'], 
          'M': ['crypto','update']}

components = defaultdict(list)
for key, values_list in source.items():
    for value in values_list:
        components[value].append(key)
结果将是

defaultdict(list,
            {'crypto': ['G', 'M'],
             'update': ['T', 'F', 'M'],
             'monitor': ['T'],
             'ipforum': ['T']})
或者,您可以创建常规dict并使用setdefault方法创建列表

components = {}
for key, values_list in source.items():
    for value in values_list:
        components.setdefault(value, []).append(key)

请注意,您还可以在列表上附加第二个和第三个元素,因为它需要额外的import@SerialLazer你对这种情况下的单元测试有什么想法吗?任何有意义的断言?{'update':['T'],'monitor':['T'],'ipforum':['T']}我只得到了@jotest这个也可以,但它需要一个额外的导入,这是不必要的,谢谢你@Newone11虽然代码“需要额外的导入”(即核心python),但它使代码更短,可读性更强。如果值不在R:R[value]=[]中,它可以避免
,但defaultdict呢(一开始?有没有办法不在该对象中包含此部分?因为它看起来不好看:/我希望你理解
defaultdict
只是扩展了
dict
。你可以像任何“常规”一样使用它dictloop-over
d.values()
并将其设置为s
set
。最终设置应与
d1.keys()相同。
defaultdict(list,
            {'crypto': ['G', 'M'],
             'update': ['T', 'F', 'M'],
             'monitor': ['T'],
             'ipforum': ['T']})
components = {}
for key, values_list in source.items():
    for value in values_list:
        components.setdefault(value, []).append(key)