Как найти Common Keys в значении ключа Pair, которые меньше указанного порога - PullRequest
2 голосов
/ 31 января 2020

У меня есть диктонар с парой ключ-значение, где я хочу установить пороговое значение менее 50% для значения, которое в основном означает в любой паре ключ-значение, где пара значений имеет значение менее 50% от всех значений, мы должны поместить это пара ключ-значение в диктонаре, а затем мы прочитали эти пары в диктонар и проверили, какие значения ключей влияют на порог.

{('a','b'):2,('b','c'):4,('c','d'):6,('d','e'):8,('e','f'):8,('f','g'):3,('g','h'):2,('h','i'):7,(i,j):10}

Как вы можете видеть в приведенной выше диктонической паре (a,b) и (b,c) имеют значения 2 и 4, которые меньше 50%, поэтому здесь мы можем сказать, потому что b является общим в обоих случаях, поэтому значение меньше 50%. Поэтому я хочу напечатать b как выходные данные. То же самое в случае (f,g) и (g,h) пара, так что здесь и вывод будет g.

Итак, последний вывод, который мне нужен, - b, g

Пожалуйста, помогите, я новичок в Python ...

Ответы [ 4 ]

2 голосов
/ 31 января 2020

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

Создайте свой словарь:

from collections import Counter
from itertools import chain

dic = {('a','b'):2,('b','c'):4,('c','d'):6,('d','e'):8,('e','f'):8,('f','g'):3,('g','h'):2,('h','i'):7}

Отфильтруйте с использованием списка:

less_5 = [k for k,v in dic.items() if v < 5]

Подсчет повторных клавиш:

counter = Counter(chain.from_iterable(less_5))
counter.most_common()

Output:
[('b', 2), ('g', 2), ('a', 1), ('c', 1), ('f', 1), ('h', 1)]

Если вы действительно хотите их распечатать:

for k,v in counter.items():
    if v > 1:
        #only print if they key appears in 2 different keys
        print(k)

Output:
b
g

Редактировать: ОП добавили вопрос в файлер на 50%.

Дополнительно вычислите ваш порог для значений и используйте тот же метод фильтрации через понимание списка.

from collections import Counter
from itertools import chain

dic = {('a','b'):2,('b','c'):4,('c','d'):6,('d','e'):8,('e','f'):8,('f','g'):3,('g','h'):2,('h','i'):7,('i','j'):10}

thresh = max(v for v in dic.values())/2 #This sets the threshold at half of max
less_thresh = [k for k,v in dic.items() if v < thresh] #This filters keys less than thresh
counter = Counter(chain.from_iterable(less_thresh))


for k,v in counter.items():
    if v > 1:
        print(k)

Output:
b
g
1 голос
/ 31 января 2020

Вот как я подошел к этой проблеме:

  1. Извлечение всех ключей на основе порогового значения 50%
  2. Слияние всех извлеченных ключей в один кортеж
  3. Извлечь все повторяющиеся буквы (, т. Е. буквы, из-за которых значение было меньше порогового значения) в Set()
def get_my_data(dictionary, threshold):
    if 0 <= threshold <= 100:
        threshold = (max([value for value in dictionary.values()])) * (threshold/100) # Sets threshold value from dictionary values
        merged_keys = ()
        for key, value in dictionary.items():
            if value < threshold:
                merged_keys += key
        return set(letter for letter in merged_keys if merged_keys.count(letter) > 1)
    else:
        return f"Invalid threshold value: {threshold}, please enter a value between 0 to 100."


your_dictionary = {('a', 'b'): 2, ('b', 'c'): 4, ('c', 'd'): 6, ('d', 'e'): 8, ('e', 'f'): 8, ('f', 'g'): 3,
                   ('g', 'h'): 2, ('h', 'i'): 7, ('i', 'j'): 10}
result = get_my_data(your_dictionary, 50)
print(result)

Вывод

{'g', 'b'}

0 голосов
/ 31 января 2020

Сначала создайте коллекцию, которая содержит буквы со значениями, а затем выполните итерацию по этой коллекции, чтобы получить желаемый результат.

data = {('a','b'):2,('b','c'):4,('c','d'):6,('d','e'):8,('e','f'):8,('f','g'):3,('g','h'):2,('h','i'):7}

# collect letters with values
collection = {}
for key, value in data.items():
    collection.setdefault(key[0], []).append(value)
    collection.setdefault(key[1], []).append(value)

# get desired results
for key, value in collection.items():
    if len(value) > 1 and all( i < 5 for i in value):
        print(key)

Вывод:

b
g
0 голосов
/ 31 января 2020

Вероятно, существует более сексуальный метод, но, тем не менее, он работает и должен быть довольно понятным.

keys_under_threshold = set() 
duplicates = set() 
for key, val in d.items(): 
    if val <= 5: 
        if key[0] not in keys: 
            keys_under_threshold.add(key[0]) 
        else: 
            duplicates.add(key[0]) 
        if key[1] not in keys: 
            keys_under_threshold.add(key[1]) 
        else: 
            duplicates.add(key[1]) 
print(duplicates)
...