我有一个元素列表,让我们说:
y = [1, 3, 1, 5, 1]
我想创建一个字典,其中:
我尝试了以下理解。
a={elem:y[i] for i, elem in enumerate(y[1:])}
但是,由于字典中的值字段不是列表,因此它仅将前一个元素保留在最后一次出现的键中。
换句话说,对于这个例子,我得到以下内容:
{3: 1, 1: 5, 5: 3}
有没有办法使用理解这样做?
注意:我忘了添加所需的结果。
{3: [1], 1: [3,5], 5: [1]}
您的密钥是重复的,因此您无法使用它们创建字典(您将丢失第一个元素)。
因此,由于你需要的积累效应,所以理解难以使用(并且效率低,正如其他理解答案所述)。
我建议使用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]})
使用enumerate
和set
操作。
{value: set(y[:i]) - {value} for i, value in enumerate(y)}
Out: {1: {3, 5}, 3: {1}, 5: {1, 3}}
这有点丑陋和低效,因为在你的例子中,每次遇到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在下面的答案中建议应该是正确的方法。