Добавить элементы в поле значения словаря, используя понимания - PullRequest
0 голосов
/ 27 августа 2018

У меня есть список элементов, скажем:

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

И я хотел бы создать словарь, в котором:

  • Ключи : элементы y
  • Значения : список элементов, которые появляются перед Ключом в y

Я попытался понять следующее.

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

Однако, поскольку поле value в словаре не является списком, оно сохраняет только предыдущий элемент в последнем появлении клавиши .

Другими словами, для этого примера я получаю следующее:

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

Есть ли способ сделать это, используя понимание?

Примечание: я забыл добавить желаемый результат.

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

Ответы [ 3 ]

0 голосов
/ 27 августа 2018

Ваши ключи дублированы, поэтому вы не можете создать из них словарь (вы потеряете первые элементы).

Таким образом, понимание трудно использовать (и неэффективно, как указано в других ответах на понимание здесь) из-за необходимого эффекта накопления.

Я предлагаю вместо этого использовать 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]})
0 голосов
/ 27 августа 2018

Использование enumerate и set операций.

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

Это немного уродливо и неэффективно, потому что в вашем примере он вырабатывает новый ответ каждый раз, когда сталкивается с 1, но работает правильно, потому что в последний раз это последний раз, когда встречается 1.

0 голосов
/ 27 августа 2018

Просто для удовольствия. Вот понимание.

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, как предложил Жан-Франсуа Фабр в своем ответе ниже, должно быть правильным.

...