向Python字典添加重复键(“两次和”问题)

时间:2018-09-20 20:34:52

标签: python python-3.x dictionary duplicates

我一直在尝试向我的python字典(表)添加重复的键,以解决“两个和”的问题。

  

给出一个整数数组,返回两个数字的索引,以便它们加起来成为一个特定的目标。

我现在已经意识到这是不可能做到的,并且希望对在没有蛮力的情况下如何解决这个问题提出任何想法或建议。请记住,我本周开始尝试学习Python。所以我很抱歉有一个简单的解决方案

numbers = [0, 0, 0, 0, 0, 0, 0]  # initial list
target = 6  # The sum of two numbers within list

# Make list into dictionary where the given values are used as keys and 
actual values are indices
table = {valueKey: index for index, valueKey in enumerate(numbers)}

print(table)

>>> {0: 6}

4 个答案:

答案 0 :(得分:1)

您根本不需要存储索引,因为两个和问题与数字所在的 无关,仅与查找它们有关。这可以通过以下方式完成:

target = 6
numbers = [1, 5, 11, -5, 2, 4, 6, 7, 21]
hashTable = {}
results = []
for n in numbers:
    if ((target - n) in hashTable and hashTable[target - n] == None):
        hashTable[target - n] = n
    else:
        hashTable[n] = None

results = [[k, v] for k, v in hashTable.items() if v != None]
print(results)

在需要数字索引的情况下,可以添加第二个字典indices

indices = {}
for i, n in enumerate(numbers):
    if ((target - n) in hashTable and hashTable[target - n] == None):
        hashTable[target - n] = n
    else:
        hashTable[n] = None
    indices[n] = i

results = [[indices[k], indices[v]] for k, v in hashTable.items() if v != None]
print(results)

请注意,要使这两种解决方案都起作用,您需要确保每个元素在列表中仅出现一次。否则,您的款项将不明确。您可以修改indices来存储出现特定值的索引列表,这将解决该问题。

答案 1 :(得分:0)

不确定是否需要使用dup键,但是可以使用值列表:

import collections

table = collections.defaultdict(list)

for i, value in enumerate(numbers):
    table[value].append(i)

diffs = enumerate(target - number for number in numbers)

for i, diff in diffs:
    if diff in table:
        indices = table[diff]
        indices.remove(i)
        if indices:
            print i, indices

我相信有更好的解决方案可以解决其他问题。

答案 2 :(得分:0)

除非您有多个目标,否则我不明白您为什么需要命令。我会改用set

numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
target = 9
answer = set()
for i, iNumber in enumerate(numbers):
    for j, jNumber in enumerate(numbers):
        if i == j:
            continue
        mySum = iNumber + jNumber
        if (mySum == target):
            answer.add((i,j))

答案 3 :(得分:0)

我将对数组进行排序,进行某种二进制搜索以搜索目标的索引(或直接未成年人),并在较小的索引和使用二进制搜索找到的索引之间的索引中寻找“两个和”。 >

例如: 数组= [5,1,8,13,2,4,10,22] 目标= 6

sorted_array = [1,2,4,5,8,10,13,22] binary_search_index = 4(数字5)

所以知道您将数组简化为:[1,2,4,5],然后可以使用de min和max索引在其中查找“两个和”。