Python-在循环中重新构造lits字典
嗨,伙计们,我有一个dict id_dict,里面有一些钥匙。在该键中,有作为值的列表(有时只有一项,有时是4项)。(这些是组件的名称)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
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-overd.values()
并将其设置为sset
。最终设置应与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)