我进行了这样的连锁条件测试:
if find_num_3 != None and find_num_3 != i and find_num_3 != j: #don't reproduce itself
使用代码:
for i in range(len(nums)):
num_1= nums[i]
sub_target = target - num_1
logging.debug(f"level_1_lookup: {lookup}")
for j in range(i+1, len(nums)):
num_2 = nums[j] #
num_3 = sub_target - num_2
find_num_3 = lookup.get(num_3) #
if find_num_3 != None and find_num_3 != i and find_num_3 != j: #don't reproduce itself
result = [num_1, num_2, num_3]
triplets.append(result)
logging.debug(f"lookup: {lookup} sub_nums: {nums[j:]} \nresult: {result}")
logging.info(f"\ttriplets: {triplets}\n\n\n\n")
return triplets
如何将长链转变为紧凑的短结构。
答案 0 :(得分:8)
if find_num_3 not in {None, i, j}
使用set而不是list或tuple,因为检查set中元素的存在效率更高。复杂度~O(1)
而非O(n)
。
集将其数据存储为键/值对。关键是存储对象的哈希。这就是为什么您不能在集合中存储具有相同哈希值的多个对象的原因。由于哈希冲突,集合中的状态检查有时可能比O(1)多一点。
Here is a nice article to better understand hashes and sets.
编辑
@chepner指出,当仅在运行时知道值时(如在问题中),使用元组比使用set更有效,因为set实例化要比tuple实例化长。
答案 1 :(得分:2)
如果只想减小行的大小,可以将条件包装在括号中:
if (find_num_3 is not None
and find_num_3 != i
and find_num_3 != j):
# ...
您可以将每个条件值存储在变量中,这很方便,因为它可以命名条件并使最终条件容易不稳定:
defined = find_num_3 is not None
not_i = find_num_3 != i
not_j = find_num_3 != j
if defined and not_i and not_j:
#...
或:
if all(defined, not_i, not_j):
# ...
您还可以检查find_num_3
是否在值列表中:
if find_num_3 not in (None, i, j):
# ...
答案 2 :(得分:1)
替换为:
{this.state.awayteam && <Line type='monotone' key={'1'} dataKey={this.state.value} stroke='#132908' yAxisId={1} activeDot={{fill: '#132908', stroke: 'none', r: 6}}/>}
答案 3 :(得分:0)
并没有真正回答您所说的问题,但是我认为简化嵌套循环比缩短find_num_3
早已清晰直接的比较更有趣。 (使用更短的变量名,例如k
来适应您已经在使用的i
和j
的模式,也会缩短比较。)
from itertools import combinations
# ...
for i, j in combinations(range(len(nums)), 2):
num_1 = nums[i]
num_2 = nums[j]
num_3 = target - (num_1 + num+2)
k = lookup.get(num_3)
if k is None or k == i or k == j:
continue
result = [num_1, num_2, num_3]
triplets.append(result)