我喜欢 Eevee 提供的答案的声音,但我很难想象一个实现。这是我对Eevee提供的答案的解释、解释和实现。
- 使用两个多米诺骨牌值的总和作为字典键。
- 将任一 domino 值存储为字典值。
例如,给定多米诺骨牌“12”,总和为 3,因此字典键将为 3。然后我们可以选择任一值(1 或 2)存储在该位置(我们将选择第一个值 1 )。
domino_pairs = {}
pair = '12'
pair_key = sum(map(int, pair))
domino_pairs[pair_key] = int(pair[0]) # Store the first pair's first value.
print domino_pairs
输出:
{3: '1'}
虽然我们只存储了多米诺骨牌对中的一个值,但另一个值可以很容易地从字典键和值中计算出来:
pair = '12'
pair_key = sum(map(int, pair))
domino_pairs[pair_key] = int(pair[0]) # Store the first pair's first value.
# Retrieve pair from dictionary.
print pair_key - domino_pairs[pair_key] # 3-1 = 2
输出:
2
但是,由于两个不同的对可能具有相同的总数,我们需要针对单个键存储多个值。因此,我们针对单个键存储值列表(即两对的总和)。把它放到一个函数中:
def add_pair(dct, pair):
pair_key = sum(map(int, pair))
if pair_key not in dct:
dct[pair_key] = []
dct[pair_key].append(int(pair[0]))
domino_pairs = {}
add_pair(domino_pairs, '22')
add_pair(domino_pairs, '04')
print domino_pairs
输出:
{4: [2, 0]}
这是有道理的。两对总和为 4,但每对中的第一个值不同,因此我们存储两者。到目前为止的实现将允许重复:
domino_pairs = {}
add_pair(domino_pairs, '40')
add_pair(domino_pairs, '04')
print domino_pairs
输出
{4: [4, 0]}
'40' 和 '04' 在 Dominos 中是相同的,所以我们不需要同时存储两者。我们需要一种检查重复项的方法。为此,我们将定义一个新函数has_pair
:
def has_pair(dct, pair):
pair_key = sum(map(int, pair))
if pair_key not in dct:
return False
return (int(pair[0]) in dct[pair_key] or
int(pair[1]) in dct[pair_key])
像往常一样,我们得到总和(我们的字典键)。如果它不在字典中,则该对不存在。如果它在字典中,我们必须检查我们对中的任何一个值是否存在于字典“bucket”中。让我们将此检查插入add_pair
,因此我们不会添加重复的多米诺骨牌对:
def add_pair(dct, pair):
pair_key = sum(map(int, pair))
if has_pair(dct, pair):
return
if pair_key not in dct:
dct[pair_key] = []
dct[pair_key].append(int(pair[0]))
现在添加重复的多米诺骨牌对可以正常工作:
domino_pairs = {}
add_pair(domino_pairs, '40')
add_pair(domino_pairs, '04')
print domino_pairs
输出:
{4: [4]}
最后,一个 print 函数展示了如何仅存储多米诺骨牌对的总和以及同一对中的单个值与存储对本身相同:
def print_pairs(dct):
for total in dct:
for a in dct[total]:
a = int(a)
b = int(total) - int(a)
print '(%d, %d)'%(a,b)
测试:
domino_pairs = {}
add_pair(domino_pairs, '40')
add_pair(domino_pairs, '04')
add_pair(domino_pairs, '23')
add_pair(domino_pairs, '50')
print_pairs(domino_pairs)
输出:
(4, 0)
(2, 3)
(5, 0)