我有一个清单。假设[3,4,2,3,4,2,1,4,5]
。
我需要根据元素的索引创建一个字典。
在这种情况下,我需要创建一个如下的dict:
{
'3':[0,3],
'4':[1,4,7],
'2':[2,5],
'1':[6],
'5':[8]
}
其中元素值是所提供列表中键的索引。
我已经尝试过了。但是只能将值更改为整数。但是无法将它们列为列表。
有没有办法仅用1个for循环来做到这一点?
我尝试过的代码:
d=dict()
ll=[1,2,1,2,1,2,3,4,5,5,4,2,4,6,5,6,78,3,2,4,5,7,8,9,4,4,2,2,34,5,6,3]
for i,j in enumerate(ll):
d[j].append(i)
print(d)
答案 0 :(得分:3)
您可以将collections.defaultdict
与enumerate
一起用于O(n)解决方案:
from collections import defaultdict
d = defaultdict(list)
A = [3,4,2,3,4,2,1,4,5]
for idx, val in enumerate(A):
d[val].append(idx)
print(d)
defaultdict(list, {1: [6], 2: [2, 5], 3: [0, 3], 4: [1, 4, 7], 5: [8]})
答案 1 :(得分:2)
mylist = [3, 4, 2, 3, 4, 2, 1, 4, 5]
d = {}
for index, item in enumerate(mylist):
d.setdefault(item, []).append(index)
产生
{3: [0, 3], 4: [1, 4, 7], 2: [2, 5], 1: [6], 5: [8]}
为什么?好吧,我们遍历列表,对于每个项目,我们首先要确保字典中有一个由该项目映射到的列表。然后,我们将相应的索引附加到该列表。结果就是字典,将每个看到的项目映射到在其上找到的索引列表。
该解决方案与jpp的解决方案相似,不同之处在于带有.setdefault()
的部分,该部分在每次循环运行时都会创建一个空列表,而defaultdict
方法仅在需要时创建新列表。
另一种方法可以是实现__missing__
的dict
子类。每当不存在密钥时都将调用它。
class ListDict(dict):
def __missing__(self, key):
l = []
self[key] = l
return l
,然后执行d[item].append(index)
。现在,只要找不到密钥,就会调用__missing__()
来“修复”问题。另请参见How can I call __missing__ from dict。
答案 2 :(得分:2)
这将起作用,您正在寻找的关键是enumerate()函数:
list_to_convert = [3,4,2,3,4,2,1,4,5]
out_dict = {}
for idx, val in enumerate(list_to_convert):
if val in out_dict:
out_dict[val].append(idx)
else:
out_dict[val] = [idx,]
print (out_dict)
赠予:
{3: [0, 3], 4: [1, 4, 7], 2: [2, 5], 1: [6], 5: [8]}
答案 3 :(得分:1)
您可以使用set
:
d = [3,4,2,3,4,2,1,4,5]
new_d = {i:[c for c, a in enumerate(d) if i == a] for i in set(d)}
输出:
{1: [6], 2: [2, 5], 3: [0, 3], 4: [1, 4, 7], 5: [8]}