我有一个元素列表,可以说:
y = [1, 3, 1, 5, 1]
我想创建一个字典,其中:
我尝试了以下理解。
a={elem:y[i] for i, elem in enumerate(y[1:])}
但是,由于字典中的 value 字段不是列表,因此它仅将前一个元素保留在最后一次出现的 key 中。
换句话说,对于此示例,我得到以下信息:
{3: 1, 1: 5, 5: 3}
有没有办法使用理解力?
注意:我忘记添加所需的结果。
{3: [1], 1: [3,5], 5: [1]}
答案 0 :(得分:2)
您的键是重复的,因此您不能使用它们创建字典(您会丢失第一个元素)。
因此,由于您需要累积效应,因此难以理解(并且效率低下,如此处其他理解答案所述)。
我建议改为使用collections.defaultdict(list)
和一个不错的旧循环:
import collections
y = [1, 3, 1, 5, 1]
d = collections.defaultdict(list)
for i,x in enumerate(y[1:]):
d[x].append(y[i]) # i is the index of the previous element in y
print(d)
结果:
defaultdict(<class 'list'>, {1: [3, 5], 3: [1], 5: [1]})
答案 1 :(得分:1)
只是为了好玩。这是一种理解。
a = {y[i]: [y[x-1] for x in range(len(y)) if y[x]==y[i]] for i in range(1, len(y))}
>> {3: [1], 1: [3,5], 5: [1]}
请注意,它太长且效率低下,无法在任何实际程序中使用。
使用让·弗朗索瓦·法布尔(Jean-FrançoisFabre)在下面的答案中建议的defaultdict
应该是正确的方法。
答案 2 :(得分:1)
使用enumerate
和set
操作。
{value: set(y[:i]) - {value} for i, value in enumerate(y)}
Out: {1: {3, 5}, 3: {1}, 5: {1, 3}}
这有点丑陋且效率低下,因为在您的示例中,每次遇到1
都会得出一个新的答案,但是由于最后一次执行是遇到{{1 }}。