在 Python 中浏览字典

Posted

技术标签:

【中文标题】在 Python 中浏览字典【英文标题】:Navigating through a dictionary in Python 【发布时间】:2017-03-20 01:42:12 【问题描述】:

我有一本名为“位置”的字典。我正在为字典编写的函数以 (d, description, current) 格式设置,其中“d”引用字典,“description”引用描述我们正在查找的位置的字符串,“current”引用发现我们当前在字典中是一对坐标 (x,y)。

基本上,每个位置在字典中都有多个位置,每个位置都有自己的一对坐标,我的目标是找到与我们当前在字典中的位置(当前)最近的位置。策略是使用距离公式来计算。

例如,如果我们正在寻找最近的加油站,而我们目前在 (2,2),如果两个加油站都在 (3,1) 和(1,4) 因为 (3,1) 更接近 (2,2) 对我当前代码的任何建议将不胜感激。

代码:

def closest(d, description, current):
    current_location = (x, y)
    d = (3,1):'gas', (1,4):'gas', (2,1):'food', (5,5):'food'
    distancesFromCurrent = [distanceFormula(z, current_location) for z in places]
    for z in d:
    if z < minimum float:
        return z

我当前的代码没有错误,但肯定不能正常工作。它只是返回 0,0,我不确定如何修复它以将最近位置的坐标返回到我们当前位置。

【问题讨论】:

不要给变量同名函数.. 感谢您指出刚刚修复它 我想补充一下,我认为问题在于找到最近的位置。不知何故,我认为我应该使用描述字符串来定位它,但不确定如何完成 【参考方案1】:

在考虑了 cmets 之后,这是我的解决方案。

#!/usr/bin/env python2
# -*- coding: utf-8 -*-
"""
Created on Sun Nov  6 21:42:22 2016

@author: michaelcurrin
"""

import math

def findDistance(A, B):
    """
    In 2D space find the distance between two co-orinates is 
    known as Eucliciean distance.
    Args
        A: tuple or list of x and y co-ordinates 
            e.g. (1,2) e.g. [1,2]
        B: as A.
    Retuns
        distance: float. Decimal value for shortest between A and B
    """
    x = (A[0] - B[0])
    y = (A[1] - B[1])
    distance = math.sqrt(x**2 + y**2) # square root

    # remove comment if you want to see this outputted
    # print distance 

    return distance


def GetClosestPlace(places, loc, feature):
    """find shortest distance between current location and each locations 
    but only ones which have the desired feature"""

    # add distance from current location to each location
    for index in range(len(places)):

        # only continue if feature exists at place
        if feature in places[index]['features']:

            # calculate
            distance = findDistance(loc,
                                    places[index]['location'])
        else:
            # this is to represent n/a for now as every location needs a distance
            # for this version, so that it will not be chosen
            distance = 1000 

            # add calculated distance to existing dictionary for location
        places[index]['distance'] = distance    


    # find shortest distance and return details for that place

    allDistances = [x['distance'] for x in places]
    shortestDistance = min(allDistances)

    for place in places:
        if place['distance'] == shortestDistance:
            return place


placesList = [dict(name='foo',location=(0,3), features=['gas', 'food']),
              dict(name='bar',location=(4,6), features=['food', 'hospital']),
              dict(name='abc',location=(0,9), features=['gas','barber']),
              dict(name='xyz',location=(2,2), features=['food','barber'])
              ]

currentLocation = (5,9)
desiredFeature='food'

closestPlace = GetClosestPlace(placesList, currentLocation, desiredFeature)

print 'Current location: %s' % str(currentLocation)
print 'Desired feature: %s ' % desiredFeature
print
print 'The closest place is...'
print 'Name: %s' % closestPlace['name']
print 'Location %s' % str(closestPlace['location'])
print 'Distance %f' % closestPlace['distance']
# join multiple features in the list with commas
print 'Features: %s' % ', '.join(closestPlace['features'])

"""
OUTPUT

Current location: (5, 9)
Desired feature: food 

The closest place is...
Name: bar
Location (4, 6)
Distance 3.162278
Features: food, hospital
"""

【讨论】:

在我上面的第二个版本中,我已经纠正了功能中的一个缺陷并改进了输出格式。另外,我为地点添加了另一个示例。 你帮了我很大的忙,我给了你最好的答案。我现在遇到一个错误,我不知道为什么。它说:第 45 行,在 GetClosestPlace 中如果 d[index]['features'] 中的功能:KeyError:0。我不确定是什么导致了关键错误 可能是因为您使用的是 Python 3.x 而我是 2.7?这会影响运行第一行、打印语句以及可能出现错误的行? 在pastebin.com 或 Github.com 上粘贴更多更新代码,我可以检查错误。 感谢我将代码和错误上传到了 pastebin。我更改了参数名称以适合我需要编写的函数pastebin.com/4npxAyn5【参考方案2】:

我认为您需要使用字典输入来计算地名与当前位置的距离作为单个浮点数(或小数)的结果。

类似

current_location = (x, y)
distancesFromCurrent = [distanceFormula(z, current_location) for z in places]

其中 distanceFormula 将在函数中使用您的距离计算。

一旦你输入了 all 个地点,那么你可以做另一个循环,在字典中找到 minimum 浮点值并返回其对应的地名和它的 co-纵坐标位置(来自原始输入)。

我认为您可以将字典输入更改为下面的这种格式。 (如果您已经有任何类似的数据向我们展示,这也会有所帮助)

placesList = [dict(name='abc',location=(0,3), features=['gas station','mall', 'police dept', 'fire dept']),
              dict(name='xyz',location=(4,5), features=['police dept', 'hospital']),
             #etc.
             ]

然后您的函数会找到最近的位置,但首先过滤掉具有与您的描述相匹配的功能的位置。

希望对您有所帮助。

【讨论】:

我还是很困惑。 z 是否等于描述字符串?最近的位置是否总是具有最小浮点值?我将如何专门搜索具有特定描述的位置的最小浮点值?以下是其中一个测试用例正在寻找的内容,如果它有助于解释:closest((3,1):'gas', (1,4):'gas', (2,1):'food' , (5,5):'food','food',(1,4)) == (2,1)。 我使用 z 作为坐标,例如(1,4),与描述不同。 哦,我以为地名是城市和城镇。作为用户的标签,这是否很重要,或者它只是与 co-ord 的服务协调? 我认为这些名称是为了指示函数搜索什么。例如,如果名称是“食物”,它应该搜索离当前位置最近的食物位置。我喜欢你从字典改为列表的想法,这样我就可以把所有的食物坐标放在一起,把所有的加油站放在一起,等等。但我仍然不知道如何找到只有一类地方的最小浮动值并将其与当前位置进行比较 我建议使用该位置,例如(3,1) 作为字典键,因为你可以同时吃东西和加气,这意味着

以上是关于在 Python 中浏览字典的主要内容,如果未能解决你的问题,请参考以下文章

python基础-字符串,列表,元组, 字典

python cookies提取——从字符串到字典(一行Python代码)

python 中关于字典的键

python中怎么取出字典的键

在python中,列表,字典的相互转换?

python 从列表中取出一个字典元素