使用理解在字典的值字段中追加元素

问题描述 投票:-1回答:3

我有一个元素列表,让我们说:

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

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

  • 键:是y中的元素
  • 值:是在y中键出现之前的元素列表

我尝试了以下理解。

a={elem:y[i] for i, elem in enumerate(y[1:])}

但是,由于字典中的值字段不是列表,因此它仅将前一个元素保留在最后一次出现的键中。

换句话说,对于这个例子,我得到以下内容:

{3: 1, 1: 5, 5: 3}

有没有办法使用理解这样做?

注意:我忘了添加所需的结果。

{3: [1], 1: [3,5], 5: [1]}

python python-3.x list-comprehension dictionary-comprehension
3个回答
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
投票

使用enumerateset操作。

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

这有点丑陋和低效,因为在你的例子中,每次遇到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]}

请注意,在任何实际程序中允许它太长且效率低。

使用defaultdict作为Jean-FrançoisFabre在下面的答案中建议应该是正确的方法。

© www.soinside.com 2019 - 2024. All rights reserved.