在集合字典中标识包含正确值的集合

时间:2016-09-09 12:13:58

标签: python python-3.x

我有一个集合字典,以及两个要测试的值。我需要识别包含两个值的集合(只有一个正确的集合)并返回该集合的密钥。我以为我可以像下面那样使用单线,但到目前为止没有成功。

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循环?谢谢你的帮助!

4 个答案:

答案 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')