#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()))