使用推导将元素添加到字典的value字段中

时间:2018-08-27 15:41:49

标签: python python-3.x list-comprehension dictionary-comprehension

我有一个元素列表,可以说:

y = [1, 3, 1, 5, 1]

我想创建一个字典,其中:

  • :是 y
  • 中的元素
  • :是 y
  • 之前出现的元素的列表。

我尝试了以下理解。

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]}

3 个答案:

答案 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)

使用enumerateset操作。

{value: set(y[:i]) - {value} for i, value in enumerate(y)}
Out: {1: {3, 5}, 3: {1}, 5: {1, 3}}

这有点丑陋且效率低下,因为在您的示例中,每次遇到1都会得出一个新的答案,但是由于最后一次执行是遇到{{1 }}。