我有一个集合字典,以及两个要测试的值。我需要识别包含两个值的集合(只有一个正确的集合)并返回该集合的密钥。我以为我可以像下面那样使用单线,但到目前为止没有成功。
d = {"set1": {"A", "B", "C"}, "set2": {"D", "E", "F"}, "set3":{"A", "D", "C"}}
value1 = "A"
value2 = "B"
def do_values_belong_in_same_set(value1, value2):
if all(x in v for k, v in d.items() for x in [value1, value2]) is True:
return True, k
else:
return False
此处所需的输出为:True," set1"
" v代表k,v代表d.items()"部分没有做到这一点。在d.values()"中也不简单" x什么会起作用?或者我只需要为此构建一个正确的for循环?谢谢你的帮助!
答案 0 :(得分:5)
'./hero-detail.Component'
答案 1 :(得分:3)
您可以通过将针字符组合成一组来使用set.issubset
(使用<=
运算符)。
d = {"set1": {"A", "B", "C"}, "set2": {"D", "E", "F"}, "set3":{"A", "D", "C"}}
value1 = "A"
value2 = "B"
needle_set = set([value1, value2])
result = next(k for k,v in d.items() if needle_set.issubset(v))
# or needle_set <= v, or v >= needle_set, or
# v.issuperset(needle_set), all are the same condition
您可以将其转换为具有所请求输出的函数,例如:
def do_values_belong_in_same_set(source_d, *values):
# I use the variadic argument `value` here so you can check any number of values
# and include the source dict by name as best practice
needle_set = set(values)
result = next(k for k,v in source_d.items() if needle_set <= v)
if result:
return True, result
else:
return False
答案 2 :(得分:0)
您可以过滤由value1和value2组成的集合为其子集的集合:
def do_values_belong_in_same_set(value1, value2):
sets = [key for key, s in d.items() if {value1, value2} <= s]
if sets:
return True, sets[0]
else:
return False
答案 3 :(得分:0)
您可以稍微更改函数中的逻辑来实现此目的:
def do_values_belong_in_same_set(value1, value2):
r = next((k for k, v in d.items() if all(i in v for i in {value1, value2})), False)
if r:
return True, r
else:
return r
如果存在,则在生成器上调用next
将返回第一个k
(集合名称),如果该值不存在,则分配默认值False
。然后你会相应地返回。
这为不同的运行产生以下结果:
do_values_belong_in_same_set(value1, value2)
(True, 'set1')
do_values_belong_in_same_set(value1, 'F')
False
do_values_belong_in_same_set(value1, 'E')
False
do_values_belong_in_same_set('F', 'E')
(True, 'set2')