Список словарей, сравнивающих 3 из 4 значений словаря - PullRequest
0 голосов
/ 14 января 2020

У меня есть рабочее решение, но мне было интересно, есть ли более элегантное или более «pythoni c» решение. У меня есть список словарей. Каждый словарь имеет 4 ключа. Мне нужно проверить, совпадают ли значения 3 ключей одного словаря со значениями ключей следующего словаря. Приведенный ниже код, помеченный символом «# Этот код», представляет собой соответствующий код. Есть ли более элегантный или более компактный способ сделать это?

Я довольно новичок в Python, и это мой первый пост здесь. Спасибо.

from operator import itemgetter
from pprint import pprint

lst = [{ "fname" : "John", "lname" : "Doe", "age" : 20, "amount":200 },
{ "fname" : "Sue" , "lname" : "Jones", "age" : 17, "amount":800 },
{ "fname" : "Rick", "lname" : "West" , "age" : 25, "amount":280 },
{ "fname" : "Sue" , "lname" : "Jones", "age" : 17, "amount":120 },
{ "fname" : "John", "lname" : "Doe"  , "age" : 20, "amount":100 }]

#Sort list
lst_sorted = sorted(lst, key=itemgetter('fname', 'lname', 'age'))
pprint(lst_sorted)
for i in range(0, len(lst_sorted)-1):
    print(lst_sorted[i])
    print(lst_sorted[i+1])
        #This code
    if ( lst_sorted[i]['fname'] == lst_sorted[i+1]['fname'] ) and \
       ( lst_sorted[i]['lname'] == lst_sorted[i+1]['lname'] ) and \
       ( lst_sorted[i]['age']   == lst_sorted[i+1]['age'] ):
        #/This code/
        print('equal')
    else:
        print('not equal')

1 Ответ

1 голос
/ 14 января 2020

Во-первых, если вы просто сравниваете последовательные элементы из вашего отсортированного списка, вы можете просто использовать zip на двух срезах:

for a, b in zip(lst_sorted[:-1], lst_sorted[1:]):
    # do things

Оператор zip выдаст кортежи соответствующих элементов в любом количестве итераций.

Срез [: -1] будет захватывать все, кроме последнего элемента, а срез [1:] будет захватывать все, кроме первого, эффективно смещая их на один. Вы можете прочитать о срезах здесь .

Затем для сравнения вы можете использовать оператор all для короткого замыкания проверки на выигравших ключах не делайте полное сравнение, если не получится. all(condition_1, ..., condition_n) эквивалентно condition_1 and ... and condition_n:

for a, b in zip(lst_sorted[:-1], lst_sorted[1:]):
    print(a, b)
        #This code
    if all(a.get(k) == b.get(k) for k in ['fname', 'lname', 'age']):
        #/This code/
        print('equal')
    else:
        print('not equal')

Где dict.get не даст вам иметь KeyError в случае, если один отсутствует

...