Python 列表值的字典理解

Python 列表值的字典理解,python,python-3.x,list-comprehension,dictionary-comprehension,Python,Python 3.x,List Comprehension,Dictionary Comprehension,我想知道是否有一种更像Python的方法来做以下事情,也许是使用字典理解: A = some list D = {} for i,v in enumerate(A): if v in D: D[v].append(i) else: D[v] = [i] 使用defaultdict: from collections import defaultdict D = defaultdict(list) [D[v].append(i) for i, v

我想知道是否有一种更像Python的方法来做以下事情,也许是使用字典理解:

A = some list
D = {}
for i,v in enumerate(A):
    if v in D:
        D[v].append(i)
    else:
        D[v] = [i]

使用
defaultdict

from collections import defaultdict
D = defaultdict(list)
[D[v].append(i) for i, v in enumerate(A)]
使用
setdefault

D = {}
[D.setdefault(v, []).append(i) for i, v in enumerate(A)]
我想不出在不整理数据的情况下使用词汇理解的任何方法:

from itertools import groupby
from operator import itemgetter
{v: ids for v, ids in groupby(enumerate(sorted(A)), itemgetter(1))}
表演:

from collections import defaultdict
from itertools import groupby
from operator import itemgetter
from random import randint

A = tuple(randint(0, 100) for _ in range(1000))

def one():
    D = defaultdict(list)
    [D[v].append(i) for i, v in enumerate(A)]

def two():
    D = {}
    [D.setdefault(v, []).append(i) for i, v in enumerate(A)]

def three():
    {v: ids for v, ids in groupby(enumerate(sorted(A)), itemgetter(1))}


from timeit import timeit

for func in (one, two, three):
    print(func.__name__ + ':', timeit(func, number=1000))
结果(一如既往,最简单的胜利):


您可以执行以下操作

d = collections.defaultdict(list)
for i,v in enumerate(A):
    d[v].append(i)

您可以看到,生成的字典的值是
list
s,在遍历时生成其元素。如果你坚持要做口述练习,你必须先找到所有的
(值,[index])
,然后在
[(k,[v])]
上做口述练习,这意味着额外的杂技没有任何好处

仅仅把列表理解作为工作的一种手段,这真的是一种恶作剧吗?我承认,我以前也遇到过这个问题,我曾考虑过通过列表来完成这项工作,但这让我感觉很不舒服。除此之外,我同意
defaultdict
作为最清晰的答案。另一种方法是使用
map
,但列表理解通常是正确的。事实上,通过查看所选答案得出了此解决方案。@user2804747很棒。如果您主要使用字典
集合
处理数据转换,那么值得一读这个模块。
d = collections.defaultdict(list)
for i,v in enumerate(A):
    d[v].append(i)