使用两个字典中的值搜索键,并在Python中输出匹配的键

时间:2018-07-12 20:11:35

标签: python

我已经编写了一些代码(或至少尝试过)来比较两个字典(X和Y)的键和值,它们具有完全相同的键但并不总是相同的值,例如x-y坐标图。该代码应该:

  1. 使用键的值搜索键(要搜索的特别需要的值由预设变量提供)。
  2. 比较结果键是否匹配,如果匹配则返回两个结果。

我在我的所有代码中都使用了Python 2.7(我是该语言的新手),但是Python 3解决方案是受欢迎的,但不是首选。

代码如下:

XDict = {
    "Jersey" : 0,
    "Boston" : -1,
    "York" : 0,
    "Vegas" : 1,
    "Diego" : 0
    }

YDict = {
    "Jersey" : 0,
    "Boston" : 0,
    "York" : -1,
    "Vegas" : 0,
    "Diego" : 1
    }


hereX = 0
hereY = 0

def GetLocation(Dict1, Dict2):
    locationX = "_"
    locationY = "not_"
    Location = ''

    for placeX, positionX in Dict1.iteritems():                  
        if positionX == hereX:
            locationX = placeX

    for placeY, positionY in Dict2.iteritems():
        if positionY == hereY:
            locationY = placeY

    if locationX == locationY:
        Location = locationX
        Location = locationY

    print Location

GetLocation(XDict, YDict)

预期输出为"Jersey"

不幸的是,该代码未产生预期的输出(产生None),这可能是由于locationX和locationY从未匹配的结果。 我尝试通过删除最后一个if块并在函数顶部插入一个while locationX <> locationY:来使用上述代码的另一种形式。但这只会导致代码永久循环。

我的代码最大目标是为Player类编写一个GetLocation()函数,该函数使用分配给每个位置的x-y坐标返回玩家的位置。我知道我可以使用单个字典和具有唯一值的键来实现此目的,但我宁愿使用x-y坐标。

我用尽了我能想到的解决方案,并尝试在Internet上其他地方(包括Stack Overflow)搜索解决方案,发现了类似且有些有用的建议,但这些都不能解决问题,包括 this

谢谢您的时间。

3 个答案:

答案 0 :(得分:1)

我对这个问题的看法:

XDict = {
    "Jersey" : 0,
    "Boston" : -1,
    "York" : 0,
    "Vegas" : 1,
    "Diego" : 0
    }

YDict = {
    "Jersey" : 0,
    "Boston" : 0,
    "York" : -1,
    "Vegas" : 0,
    "Diego" : 1
    }


hereX = 0
hereY = 0

for ((n1, x), (n2, y)) in zip(XDict.items(), YDict.items()):
    if (x==hereX) and (y==hereY):
        print(n1)
        break

打印:

  

泽西

但是,目前尚不清楚为什么在两个字典中都存储城市名称。更好的解决方案是像这样存储数据集:

d = {(0, 0): "Jersey",
     (-1, 0): "Boston",
     (0, -1): "York",
     (1, 0): "Vegas",
     (0, 1): "Diego"}

这样,您可以通过d[(hereX, hereY)]将其编入索引。

答案 1 :(得分:1)

您并没有存储具有必需值的所有键。您需要存储所有它们,然后找到交点。

XDict = {
    "Jersey" : 0,
    "Boston" : -1,
    "York" : 0,
    "Vegas" : 1,
    "Diego" : 0
    }

YDict = {
    "Jersey" : 0,
    "Boston" : 0,
    "York" : -1,
    "Vegas" : 0,
    "Diego" : 1
    }


hereX = 0
hereY = 0

def GetLocation(Dict1, Dict2):
    locationX = []
    locationY = []
    Location = ''

    for placeX, positionX in Dict1.items():                  
        if positionX == hereX:
            locationX.append(placeX)

    for placeY, positionY in Dict2.items():
        if positionY == hereY:
            locationY.append(placeY)

    print(set(locationX).intersection(set(locationY)))

GetLocation(XDict, YDict)

输出:

{'Jersey'}

答案 2 :(得分:0)

首先,请遵循一些样式指南,例如 PEP8

我使用生成器为您解决

XDict = {
"Jersey" : 0,
"Boston" : -1,
"York" : 0,
"Vegas" : 1,
"Diego" : 0
}

YDict = {
    "Jersey" : 0,
    "Boston" : 0,
    "York" : -1,
    "Vegas" : 0,
    "Diego" : 1
    }

def keys_of_equal_vales(dict1, dict2):
    for key in dict1 :
        if key in dict2 and dict1[key]==dict2[key]:
            yield key
        else :
            continue 
    raise StopIteration 

print(list(keys_of_equal_vales(XDict,YDict)))

结果:

['Jersey']