测试多组成员资格的更好方法?

时间:2018-11-14 20:51:11

标签: python

我的代码很糟糕,是否有Python方式可以改善它?

我有三套:

set1 = {1,2,3}
set2 = {2,3,4}
set3 = {4,5,6}

和组合集

combined = set1 | set2 | set3

我需要一个可返回是否每个数字都为数字的字典。

例如

d[2] = {'set1':True, 'set2':True, 'set3':False}

我的代码是这样的:

def in_set(num):
    d = {}
    if num in set1:
        d['set1'] = True
    else:
        d['set1'] = False

    if num in set2:
        d['set2'] = True
    else:
        d['set2'] = False

    if num in set3:
        d['set3'] = True
    else:
        d['set3'] = False

    return d

5 个答案:

答案 0 :(得分:6)

您可以使用以下方法简化此操作:

def in_set(num):
    return {
        'set1': num in set1,
        'set2': num in set2,
        'set3': num in set3
    }

您甚至可以创建映射到这些集合的集合名称的字典,然后使用字典理解:

my_sets = {
    'set1': set1,
    'set2': set2,
    'set3': set3
}

def in_set(num):
    return {
        k: num in v
        for k, v in my_sets.items()
    }

在这里,我们可以轻松更改集合(或它们的名称),例如,使用更多/其他集合。

答案 1 :(得分:2)

首先从字典开始;在var1,var2,var3模式中命名单个变量通常通常表示您首先需要某种容器。

然后它变成简单的字典理解:

Scanner s = new Scanner(System.in);
    System.out.println(checkDigit("")); 

答案 2 :(得分:1)

如果列出所有集合,则可以执行以下操作:

sets = [set1, set2, set3]

num = 1
print {'set{}'.format(i+1): num in set_i for i, set_i in enumerate(sets)}

理解不是最干净的,但也不是太糟糕:)

输出:

{'set1': True, 'set2': False, 'set3': False}

答案 3 :(得分:1)

当涉及到pythonic的做事方式时,取决于更广泛的图片

例如,您可以创建一个函数,给一个元素一个集合的集合,它将返回包含该集合的集合,类似这样。

def contained_in_which(elem, list_of_sets):
    temp = []
    for i, s in enumerate(list_of_sets):
        if elem in s:
            temp.append(i)

这可能是一种方法,不是很pythonic,但是很干净。

如果您想变得更复杂,可以执行以下操作。

根据情况,使用起来似乎有点通用,因为它只是集合的一个额外属性,您可以做类似的事情,有趣的是,您可以更好地安排数据结构可以扩展很多默认值。

class NamedSet(set):
    def __init__(self, *args, name="SET"):
        if isinstance(args[0], set) and len(args) == 1:
            args = list(args[0])    
        self.name = name
        super().__init__(args)

set1 = NamedSet({1,2,3}, name="ONE")
set2 = NamedSet({2,3,4}, name="TWO")
set3 = NamedSet({4,5,6}, name="THREE")
setList = [set1, set2, set3]

n = 2 
for i in filter(lambda i_set: 2 in i_set, setList):
    print(i.name)

答案 4 :(得分:0)

以下是使用functools.reduce()的灵活方式和用户友好方式:

from functools import reduce

# Update and return dictionary d.
update_dict = lambda d, key, value: (d.update({key: value}), d)[1]

def in_sets(num, **kwargs):
    return reduce(lambda d, kv: update_dict(d, kv[0], num in kv[1]), kwargs.items(), {})

if __name__ == '__main__':

    test1 = in_sets(3, set1={1,2,3}, set2={2,3,4}, set3={4,5,6})
    print(test1)  # -> {'set1': True, 'set2': True, 'set3': False}

    test2 = in_sets(5, set1={1,2,3}, set2={2,3,4}, set3={4,5,6})
    print(test2)  # -> {'set1': False, 'set2': False, 'set3': True}