Как сравнить значения в словаре python
Перейти к содержимому

Как сравнить значения в словаре python

  • автор:

Как сравнить значения словаря в Питон 3.5?

У меня есть массив словарей. После пользовательского ввода формируется новый словарь, который нужно сравнить со всеми словарями массива и вернуть только те словари, которые подошли под запрос. Подскажите пожалуйста, как это эффективно провернуть? При этом возможно, что в пользовательском словаре для поиска будут ключи, которых нет в некоторых словарях из массива, а так же ключей может быть меньше. В примере я должен получить третий словарь.

def sample(): obj = [< 'a': 1, 'b': 2, 'c': 3 >, < 'a': 4, 'b': 23 >, < 'a': 1, 'b': 3, 'c': 4 >] return obj def search(): custom =
  • Вопрос задан более трёх лет назад
  • 4045 просмотров

Комментировать

Решения вопроса 1

result = [] for i in obj: if all(item in i.items() for item in custom.items()): result.append(i) return result

Ответ написан более трёх лет назад

Комментировать

Нравится 1 Комментировать

Ответы на вопрос 1

Если данных много, можете сделать инвертированный индекс, ( напр. ключ (‘a’, 1) будет содержать список всех словарей где есть <'a': 1>), таким образом нужно будет перебирать не все данные, а только часть. Будет работать гораздо быстрее.

Ответ написан более трёх лет назад

Комментировать

Нравится 1 Комментировать

Ваш ответ на вопрос

Войдите, чтобы написать ответ

php

  • PHP
  • +1 ещё

Как unserialize данные от питона?

  • 1 подписчик
  • 34 минуты назад
  • 31 просмотр

Как сравнить значения словаря со списком и при совпадении напечатать ключ?

Находил решение в интернете, но подстроить под мой случай не смог, получаю ошибки. Вот мой гавнокод:

a = input().split() # Нужно вводить строки через пробел: a ab abc aab n = int(input()) # Вводим одно число index = [] for s in a: index.append([s.find(c) for c in s]) print(index) # Выводит вложенные списки вида [[a,b,c], [d,e,f]] dict_ = dict(zip(a, index)) print(dict_) # Превращает вложенный список в словарь вида temp = [] count = 0 lst = [] while n != 0: word = input().split() for s in word: lst = [s.find(ss) for ss in s] print(lst) # Циклически выводит списки: [a,b,c] n -= 1

Код разделен на две части, первая часть создает словарь, а вторая просит вводить строки, которые нужно вводить по очереди. Дальше не реализовал, но после каждого ввода программа должна сравнивать её со значениями словаря и при совпадении поместить ключ этого значения в переменную и распечатать её, а если не совпадает, то запрашивает вводить еще, пока не закончатся попытки, указанные в переменной n. Пожалуйста, помогите дописать эти несколько строчек в последнем цикле.

  • Вопрос задан более трёх лет назад
  • 2681 просмотр

2 комментария

Простой 2 комментария

Сравнить значения словаря из списка и при совпадении выдать ключ из словаря

В чем у вас проблема? И по какому принципу устанавливается связь между ключом словаря и элементом списка?

13 дек 2017 в 8:51
Поправьте заголовок или тело вопроса — они полностью противоположные
13 дек 2017 в 8:52
mkkik, ну собственно проблема в самом написании (
13 дек 2017 в 9:05

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

13 дек 2017 в 10:16
@rrron, а что вам не так в моем коде? просто, любопытно 🙂 можно иначе — eval.in/918348
13 дек 2017 в 10:26

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

In [24]: dictionary = In [25]: lst = ["val", "val2", "val3"] In [26]: reversed_dict = In [27]: result = [reversed_dict[x] for x in list(set(dictionary.values()) & set(lst))] In [28]: result Out[28]: ['key', 'key2'] 

Но вариант в ответе ранее лучше и проще 🙂

In [35]: list(filter(lambda x: dictionary[x] in lst, dictionary)) Out[35]: ['key', 'key2'] 

Отслеживать
ответ дан 13 дек 2017 в 11:14
Pavel Durmanov Pavel Durmanov
5,728 3 3 золотых знака 21 21 серебряный знак 44 44 бронзовых знака
Второй вариант подошел, супер! )
13 дек 2017 в 14:56

я не умею про питон, но что-то такое должно работать, может, неэффективно

for i in dictionary : for j in list : if j == dictionary[i] : print(i) 

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

print([k for k,v in dictionary.items() if list.count(v)]) 

Или даже по мотивам ответа @Alban

print([k for k,v in dictionary.items() if v in list]) 

Сравнение значений внутри словаря

Стоит задача сравнить скиллы клиента и заданной профессии. Пока получается сделать это только вручную, но нужен вариант делать это в цикле (профессий будет много). Можно ли это реализовать с помощью сравнений внутри одного словаря?

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
DS = ['Scikit-learn', 'OpenCV', 'PostreSQL', 'NLTK', 'Pandas', 'TensorFlow', 'Python'] print('\nСкиллы для Data Scientist:', DS, '\n') Python = ['Python', 'Django','Flask', 'CI/CD', 'Docker', 'English'] print('Скиллы для Python разработчика:', Python, '\n') SQL = ['SQL', 'PostgreSQL', 'MongoDB', 'English'] print('Скиллы для SQL разработчика:', SQL, '\n') len_ds = len(DS) len_python = len(Python) len_sql = len(SQL) #print('Длина скиллов необходимых для DS =', len_ds) Novichok = ['Pandas', 'Python', 'C++'] print("Новичок обладает данными скиллами:", Novichok, "\n") result_DS=list(set(DS) & set(Novichok)) result_Python=list(set(Python) & set(Novichok)) result_SQL=list(set(SQL) & set(Novichok)) # for i in cikl: # list(set(Novichok)) len_nchk = len(Novichok) #print('Длина скиллов новичка =', len_nchk) print("Соответствие новичка и нужных скиллов для Data Scientist: ", result_DS, ". Процент: ", round((len_nchk/len_ds)*100, 2), "%") print("Соответствие новичка и нужных скиллов для Python разработчика: ", result_Python, ". Процент: ", round((len_nchk/len_python)*100, 2), "%") print("Соответствие новичка и нужных скиллов для SQL разработчика: ", result_Python, ". Процент: ", round((len_nchk/len_sql)*100, 2), "%") dict = {'client': 'Pandas', 'Python', 'C++', 'py': 'Python', 'Django'}

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *