如何找到小于指定阈值的键值对中的公共键
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
以下是我解决这个问题的方法:
- 根据50%的阈值提取所有key
- 将所有提取的键合并到一个元组中
- 提取
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'}
我有一个带有键值对的字典,我想将阈值设置为小于 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
以下是我解决这个问题的方法:
- 根据50%的阈值提取所有key
- 将所有提取的键合并到一个元组中
- 提取
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'}