Вопрос:

изо всех сил, чтобы избежать повторных значений из списка понимания

python list list-comprehension

24 просмотра

2 ответа

928 Репутация автора

У меня есть list1, как это:

['A' '0' '0' '0' 'A']

У меня есть dict1, как это:

{1.12: 0, 1.21: 'A', 1.22: 'B', 1.41: 0, 1.31: 'A', 1.32: 'B', 2.11: 0}

Я с нетерпением жду, чтобы получить ключи dict1 на основе значений dict1 в списке list1, используя следующие

np.array([dict1[x] for x in list1])

Вывод:

[1.31 3.41 3.41 3.41 1.31]

Однако я хотел бы вывести:

[1.21  1.12  1.41  2.11 1.31]   

Как я могу получить к этому выводу, не повторяя ключи словаря в результате понимания списка

Автор: ge00rge Источник Размещён: 11.08.2019 07:36

Ответы (2)


0 плюса

30815 Репутация автора

Решение

С вашим пониманием списка:

[dict1[x] for x in list1]

То, что вы пытаетесь сделать, это перебрать список и собрать все значения, связанные с элементами в списке, как ключ в словаре. Ваш код имеет следующие проблемы:

а. Что, если ключ не найден в словаре, это приведет к исключению.
б. Вам нужно проверить, присутствует ли значение в dict с данными такими же, как в списке.

Решение будет что-то вроде:

np.array([key for key, value in dict1.items() if value in list1])

Таким образом, вы перебираете dict и проверяете наличие значения в списке как одно и то же время и только если оно присутствует, а затем принимаете его, игнорируя то же самое.

Гораздо более эффективным способом поиска будет преобразование в list1набор, так что предложение in может вернуть результат O (1), а не O (N), чтобы повысить производительность. Должно быть как:

myset = set(list1) ##assuming this you could create beforehand if possible instead of list
np.array([key for key, value in dict1.items() if value in myset])
Автор: SMA Размещён: 11.08.2019 07:47

0 плюса

11 Репутация автора

Я думаю, что структура ваших данных делает эту проблему более сложной, чем она есть. Если вы измените это, проблема станет намного легче решить.

Во-первых, вы пытаетесь найти ключи по значениям, когда дикты предназначены для использования наоборот.

Во-вторых, вы пытаетесь найти несколько элементов по одному значению. Что можно сделать, вытолкнув элементы из списка значений.

Так что если вы реструктурируете свои данные следующим образом:

data = {'A': [1.31, 1.21], 'B': [1.32, 1.22,], '0': [2.11, 1.41, 1.12]}

Вы можете просто найти соответствующий список и вывести значение следующим образом:

results = [dict2[value].pop() for value in list1]

Примечание: в примечании в вашем списке отсутствуют запятые в вашем вопросе.

Автор: Jos88 Размещён: 11.08.2019 08:40
Вопросы из категории :
32x32