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

#python #dictionary #compare

#python #словарь #Сравнить

Вопрос:

пожалуйста, помогите, у меня есть такой словарь :

sdata = {‘A’: [1, 2, 3, 4, 5, 6],’ B’: [11, 12, 3, 14, 15], ‘ C’: [8, 9, 10, 1 ,2], ‘ D’: [15, 3, 18, 19, 20]}

я хочу, чтобы результат был похож:

Количество одинаковых цифр в A и C: 2

число: 1, 2

количество одинаковых цифр в B и D: 1

15

а также сравните все 4 ключа и верните номер уникальной цифры. которое было бы уникальным числом 17.

Ниже приведен мой код:

 keyAvalue = sdata.get('A')
    keyCvalue = sdata.get('C')
    keyBvalue= sdata.get('B')
    keyDvalue= sdata.get('D')
    countA= len(keyAvalue)
    countC= len(keyCvalue)
    compareAC = []
    compareBD= []
    for number in keyAvalue:
        if number in keyCvalue:
            if number not in compareAC:
                compareAC.append(number)
                countAC = len(compareAC)
    for number in keyBvalue:
        if number in keyDvalue:
            if number not in compareBD:
                compareBD.append(number)
                countBD = len(compareBD)
    for key, value in studentData.items():
        count = len([item for item in value if item]) #count number of values in key
        value.sort()
        formatValue = (" ".join(map(str,value)))
        formatAC = (" ".join(map(str,compareAC)))
        formatBD = (" ".join(map(str,compareBD)))   
 print (f'in both A and C = {countAC}nnumber: {formatAC}n')
    print (in both B and D = {countBD}nnumber: {formatBD}n')
    print (f'Number of unique number in A and C = {countA   countC - countAC}')
  

есть ли более простой способ сделать это? пожалуйста, помогите, заранее благодарю вас. Кстати, я не предполагаю использовать set тип данных для этого.

Ответ №1:

 sdata = {'A': [1, 2, 3, 4, 5, 6],'B': [11, 12, 3, 14, 15], 'C': [8, 9, 10, 1 ,2], 'D': [15, 3, 18, 19, 20]}

#going through the elements in sdata
for key in sdata.keys():
  #comparing every other list in sdata
  other_keys = [other for other in sdata.keys() if other != key]

  #checking the other list
  for other in other_keys:
    #the simliar count and value
    simliar = 0
    sim_vals = []
    #going through each value in the main list
    for value in sdata[key]:
      #checking if it is in the list
       if value in sdata[other]:
         simliar  = 1
         sim_vals.append(value)

    print(other, key)
    #printing answer
    print(simliar)
    print(sim_vals)
  

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

1. Это должно сработать, если я правильно понял проблему.

2. Здравствуйте, большое спасибо, код работает, но в этом коде сравниваются все ключи и значение, могу я узнать, как я могу печатать только AC или BD?

3. Вы можете просто выполнить простой цикл if при его печати. Например, вы можете выполнить печать if key == A и other == C.

Ответ №2:

Найти общие элементы между двумя списками можно с помощью set.intersection().

предположим, у нас есть 2 списка:

 list1 = [1, 2]
list2 = [1,3]
  

Преобразуйте list1 в set, чтобы мы могли выполнить над ним операцию пересечения.

 list1_as_set = set(list1)
intersection = list1_as_set.intersection(list2)
  

теперь снова преобразуйте это пересечение в список

 intersection_as_list = list(intersection)
  

Вывести количество общих элементов в двух списках и его общие элементы:

 print("Number of common elements in list1 and list2: {}".format(len(intersection_as_list)))
print("common elements in list1 and list2: {}".format(intersection_as_list))
  

Ответ №3:

Попробуй это

 from itertools import chain

def common_digits(l1, l2):
    return list(set(l1).intersection(l2))

def unique(l):
    return len(set(chain.from_iterable(l)))

sdata = {'A': [1, 2, 3, 4, 5, 6],'B': [11, 12, 3, 14, 15], 'C': [8, 9, 10, 1 ,2], 'D': [15, 3, 18, 19, 20]}

print(common_digits(sdata['A'], sdata['C']))

print(common_digits(sdata['B'], sdata['D']))

print(unique(sdata.values()))