Сравнение ключей в списке словарей

#python #list #dictionary #compare #key

#python #Список #словарь #Сравнить #Клавиша

Вопрос:

Я пытаюсь сравнить два списка словаря. Первый словарь содержит ключи «pairs» и «prob». Этот словарь отсортирован в обратном порядке по ‘prob’. Затем верхние элементы первого списка с x-суммой сравниваются со вторым списком, в котором есть ключи «пары» и «расстояние». Я сравниваю только для того, чтобы увидеть, есть ли «пары» из первого списка во втором списке. Если он найден, мне нужно сохранить запись о найденном совпадении. результатом является количество совпадений

 from operator import itemgetter
list1 = [
    {"pairs": (1, 107), "prob": .78},
    {"pairs": (1, 110), "prob": .98},
    {"pairs": (1, 111), "prob": .74},
    {"pairs": (1, 114), "prob": .42},
    {"pairs": (1, 74), "prob": .24},
    {"pairs": (1, 75), "prob": .25},
    {"pairs": (10, 24), "prob": .61},
    {"pairs": (10, 28), "prob": .40},
    {"pairs": (10, 77), "prob": .42},
    {"pairs": (10, 78), "prob": .60}]


list2 = [
    {"pairs": (1, 100), "distance": 7.507},
    {"pairs": (1, 110), "distance": 6.981},
    {"pairs": (1, 111), "distance": 6.741},
    {"pairs": (1, 114), "distance": 7.432},
    {"pairs": (1, 7), "distance": 5.247},
    {"pairs": (1, 75), "distance": 7.254},
    {"pairs": (11, 24), "distance": 7.611},
    {"pairs": (11, 20), "distance": 6.407},
    {"pairs": (10, 77), "distance": 6.422},
    {"pairs": (10, 78), "distance": 6.607}]

def analyze(expected,actual):

    matches = 0

    sorted_list = sorted(expected,key=lambda k: k['prob'],reverse=True)
    toptenth = len(sorted_list)/10
    topfifth = len(sorted_list)/5
    tophalf = len(sorted_list)/2

    for i in range(toptenth):
       if expected[i]..........

    print matches
  

Я не уверен, как сравнить максимальное количество элементов в списке один с парами списка 2. Я решил взять каждый элемент в списке один с нужным мне диапазоном (верхняя десятая, верхняя пятая и верхняя половина), затем выполнить итерацию по элементу в списке 2. Но я не знаю, имеет ли значение разный размер между списком 1 и списком 2, и я не знаю, как просто сравнить «пары» значений ключа

Комментарии:

1. Вы говорите I am only comparing to see if the "pairs" from the first list are in the second list. , но все пары из первого списка находятся во втором списке. Я не понимаю.

2. Это фиктивный список. Второй список может содержать разные пары. Фактические списки, которые даны, могут содержать гораздо больше элементов и могут иметь разные пары.

3. Я изменил список 2 для уточнения.

4. пожалуйста, покажите нам ваш ожидаемый результат. Спасибо.

Ответ №1:

Ваш вопрос не совсем ясен. Например, вы берете верхние 1/10, 1/5 и 1/2 первого списка, но не указываете, из какого соотношения вы хотите взять количество совпадений. В любом случае, это некоторый код, который может помочь вам решить вашу проблему. Я отредактирую его, если вы предоставите больше информации.

 def analyze(expected,actual):

    sorted_list = sorted(expected, key=lambda k: k['prob'],reverse=True)
    toptenth = sorted_list[:int(len(sorted_list)/10)]
    topfifth = sorted_list[:int(len(sorted_list)/5)]
    tophalf = sorted_list[:int(len(sorted_list)/2)]

    actual_pairs = [el["pairs"] for el in actual]

    matching_tenth = len([el for el in toptenth if el["pairs"] in actual_pairs])
    matching_fifth = len([el for el in topfifth if el["pairs"] in actual_pairs])
    matching_half = len([el for el in tophalf if el["pairs"] in actual_pairs])
    return {    "tenth": matching_tenth,
                "fifth": matching_fifth,
                "half": matching_half}

print (analyze(list1, list2))
  

Вывод:

 {'tenth': 1, 'fifth': 1, 'half': 3}
  

Комментарии:

1. Извините за двусмысленность. В конечном итоге мне нужно будет подсчитать совпадения для каждого соотношения; однако мне нужно только десятое соотношение, чтобы я начал рисовать в качестве примера, чтобы завершить остальное самостоятельно

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