Как проверить, совпадают ли значения списка в словаре - PullRequest
0 голосов
/ 10 сентября 2018

Я пытаюсь найти соответствие из моего списка списку в значении словаря

Например, словарь содержит

dict = {test1:[1, 2, 3, 4], test2:[2, 2, 3, 4], test3:[1,2,4,5], 
        test4:[6,2,3,4], test5:[7, 2, 3,4]}

и данные, для которых нужно найти совпадения, если

answer = [6,2,3,4]

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

[(это другое), 2,3,4]

поэтому в конце я хочу записать test1, test2 и test 5.

Спасибо!

Ответы [ 5 ]

0 голосов
/ 10 сентября 2018

Обратите внимание, что вы должны подумать об абстрагировании в функцию.

def match_records(a, b):
    return a[-3:] == b[-3:] and a[0] != b[0]

results = {k:v for k, v in d.items() if match_records(answers, v)}
0 голосов
/ 10 сентября 2018

Я думаю, что есть несколько проблем с вашим кодом. Во-первых, поскольку dict является ключевым словом, его следует избегать в качестве имени переменной. Во-вторых, переменные test1, test2 и т. Д. Не определены. В этом случае лучше использовать «test1», «test2» и т. Д.

В любом случае, смотрите ответ ниже.

            dic = {'test1':[1, 2, 3, 4], 'test2':[2, 2, 3, 4], 'test3':[1,2,4,5], 
                'test4':[6,2,3,4], 'test5':[7, 2, 3,4]}


            toMatch = [6,2,3,4]

            matching = []
            for (key, value) in dic.items():
                if((value[1:]==toMatch[1:])&(value[0]!=toMatch[0])):
                    print(key,value)
                    matching.append(key)

            print('Matching keys are:', matching)

Ответ:

test1 [1, 2, 3, 4]
test2 [2, 2, 3, 4]
test5 [7, 2, 3, 4]
Matching keys are: ['test1', 'test2', 'test5']
0 голосов
/ 10 сентября 2018

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

d = {
    "test1": [1, 2, 3, 4], 
    "test2": [2, 2, 3, 4], 
    "test3": [1, 2, 4, 5], 
    "test4": [6, 2, 3, 4], 
    "test5": [7, 2, 3, 4]
}
answer = [6, 2, 3, 4]

result = [k for k, v in d.items() if v[0] != answer[0] and v[1:] == answer[1:]]

print(result)

Выход:

['test1', 'test2', 'test5']

Обратите внимание, что dict = ... перезаписывает встроенную функцию dict, что не очень хорошая идея.

Вот repl для проверки.

0 голосов
/ 10 сентября 2018

Решение

dict_a = { 
    'test 1': [1, 2, 3, 4], 'test 2': [2, 2, 3, 4], 'test 3': [1, 2, 4, 5], 
    'test 4': [6, 2, 3, 4], 'test 5': [7, 2, 3, 4]
}

answer = [6, 2, 3, 4]

for i in dict_a:
    if answer[0] != dict_a[i][0]:
        if answer[1:4] == dict_a[i][1:4]:
            print(dict_a[i])

Выход магазина

answer = [6, 2, 3, 4]
store = {}

for i in dict_a:
    if answer[0] != dict_a[i][0]:
        if answer[1:4] == dict_a[i][1:4]:
            store[i] = dict_a[i]

for k in store:
    print(f"{k}: {store[k]}")

Выход

(xenial)vash@localhost:~/python/AtBS$ python3.7 list_dict.py 
[1, 2, 3, 4]
[2, 2, 3, 4]
[7, 2, 3, 4]
0 голосов
/ 10 сентября 2018

Вы можете выполнять итерацию по элементам dict и сравнивать фрагменты подсписков с фрагментом списка, с которым вы хотите проверить:

d = {'test1':[1, 2, 3, 4], 'test2':[2, 2, 3, 4], 'test3':[1,2,4,5], 'test4':[6,2,3,4], 'test5':[7, 2, 3,4]}
def check(d, l):
    for k, v in d.items():
        if v != l and v[1:] == l[1:]:
            yield k
print(list(check(d, [6, 2, 3, 4])))

Это выводит:

['test1', 'test2', 'test5']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...