сравнить значения словаря python типа list, чтобы увидеть, совпадают ли они в этом порядке - PullRequest
0 голосов
/ 26 декабря 2018
prefs = 
{
    's1': ["a", "b", "c", "d", "e"],
    's2': ["c", "d", "e", "a", "b"],
    's3': ["a", "b", "c", "d", "e"],
    's4': ["c", "d", "e", "b", "e"]
}

У меня есть словарь, и я хочу сравнить значения (Тип: Список) для каждого ключа, чтобы увидеть, существуют ли они в этом порядке.По сути, я пытаюсь перебрать каждую пару ключ-значение и сравнить значение, имеющее тип со списком, со следующим значением, чтобы увидеть, совпадают ли элементы в этом списке в указанном порядке.Если мы найдем соответствие, я хочу вернуть список ключей, которые соответствуют.

Пример: значение s1 представляет собой список с элементами "a", "b", "c", "d", "e", поэтому я хочу проверить другие значения с элементами в том же порядке.Таким образом, в этом случае ключ s3 будет возвращен, поскольку значения совпадают с одинаковым точным порядком.Значение s1 = значение s3, поскольку элементы в списке совпадают в одинаковом порядке.список возврата будет выглядеть примерно так [s1: s3], и должно быть возвращено несколько совпадений.

Ответы [ 2 ]

0 голосов
/ 26 декабря 2018

Сначала выполните сортировку по значениям, используя sorted, затем используйте itertools.groupby

prefs = {
            's1': ["a", "b", "c", "d", "e"],
            's2': ["c", "d", "e", "a", "b"],
            's3': ["a", "b", "c", "d", "e"],
            's4': ["c", "d", "e", "b", "e"],
            's5': ["c", "d", "e", "a", "b"]
        }

from itertools import groupby
[[t[0] for t in g] for k,g in groupby(sorted(prefs.items(), key=lambda x:x[1]), lambda x:x[1])]
#[['s1', 's3'], ['s2', 's5'], ['s4']]

Для печати со значениями:

{tuple(k):[t[0] for t in g] for k,g in groupby(sorted(prefs.items(), key=lambda x:x[1]), lambda x:x[1])}

Вывод:

{('a', 'b', 'c', 'd', 'e'): ['s1', 's3'],
 ('c', 'd', 'e', 'a', 'b'): ['s2', 's5'],
 ('c', 'd', 'e', 'b', 'e'): ['s4']}
0 голосов
/ 26 декабря 2018

Чтобы найти подходящие списки, вы можете сделать что-то вроде этого:

prefs = {
    's1': ["a", "b", "c", "d", "e"],
    's2': ["c", "d", "e", "a", "b"],
    's3': ["a", "b", "c", "d", "e"],
    's4': ["c", "d", "e", "b", "e"],
    's5': ["c", "d", "e", "b", "e"]
}

matches = {}
for key, value in prefs.items():
    value = tuple(value)
    if value not in matches:
        matches[value] = []
    matches[value].append(key)

print(matches)

Что печатает:

{('a', 'b', 'c', 'd', 'e'): ['s1', 's3'], ('c', 'd', 'e', 'b', 'e'): ['s5', 's4'], ('c', 'd', 'e', 'a', 'b'): ['s2']}

(Примечание: я добавил s5 к prefs.)


Обновление

Если вы просто хотите сгруппировать ключи, вы можете получить к ним доступ через matches.values():

print(*matches.values())

Какие распечатки:

['s4', 's5'] ['s1', 's3'] ['s2']

Кроме того, вы можете сделать все это в одну строку, если хотите:

print({value: [key for key in prefs if tuple(prefs[key]) == value] for value in set(map(tuple, prefs.values()))})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...