如何在Python中将dict元素值设置为列表

如何在Python中将dict元素值设置为列表,python,python-3.x,python-2.7,list,dictionary,Python,Python 3.x,Python 2.7,List,Dictionary,我有一张单子。比如说[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,

我有一张单子。比如说
[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)

您可以使用
集合

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]}
对于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]})
导致

{3: [0, 3], 4: [1, 4, 7], 2: [2, 5], 1: [6], 5: [8]}
为什么??好的,我们迭代列表,对于每个项目,我们首先确保字典中有一个由该项目映射到的列表。然后我们将相应的索引附加到该列表中。结果是一个字典,它将每个看到的项映射到它所在的索引列表

该解决方案与jpp的解决方案类似,除了带有
.setdefault()
的部分,该部分在每次循环运行中创建一个空列表,而
defaultdict
方法仅在需要时创建新列表

另一种方法可以是实现的
dict
子类。只要不存在密钥,就会调用此函数

class ListDict(dict):
    def __missing__(self, key):
        l = []
        self[key] = l
        return l

然后只需执行
d[item]。追加(索引)
。现在,每当找不到密钥时,就会调用
\uuu missing\uuu()
,从而“修复”问题。另请参见。

这将起作用,您要寻找的关键是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]}

是的,有一种方法只使用一个循环。您尝试过什么?@Sukumar将其编辑到您的问题中,不要在commentsAh中发布代码,如果字典条目的默认值是空列表,那么这将起作用。请参阅@jpp的解决方案。键应该是
str
,还是
int
?我遇到了这个解决方案。但是我想知道是否有什么方法可以不用导入任何东西就可以做到这一点。@Sukumar导入任何东西有什么问题吗?是的,我们在那里寻找
setdefault
,太早了:PNice一行,但即使使用
set
这也是O(n²)。@Ajax1234您的解决方案一看起来很棒:-)
{3: [0, 3], 4: [1, 4, 7], 2: [2, 5], 1: [6], 5: [8]}