我的代码很糟糕,是否有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
答案 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}