如何找到小于指定阈值的键值对中的公共键

How to find Common Keys in key value Pair which are Less than the Specified Threshold

我有一个带有键值对的字典,我想将阈值设置为小于 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%。所以我想在 (f,g)(g,h) 对的情况下将 b 打印为 output.Same 所以这里的输出也将是 g.

所以我想要的最终输出是-- b,g

请帮助我是新手 Python...

可能有更性感的方法,但这个方法仍然有效,应该很容易理解。

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)

如果你想从字典中获取相似不重复的元组值的键,你可以先过滤掉大于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

编辑:OPs 向 filer 添加了 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

首先创建包含字母及其值的集合,然后迭代此集合以获得所需结果。

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

以下是我解决这个问题的方法:

  1. 根据50%的阈值提取所有key
  2. 将所有提取的键合并到一个元组中
  3. 提取Set()
  4. 中的所有重复字母(导致值小于阈值的字母)
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'}