2016-02-05 2 views
0

Вот фрагмент моего кода до сих порSplit Упорядоченный словарь в переменные в Python

import osmapi 
import geopy 
from geopy.geocoders import Nominatim 
import requests 
import xmltodict 

geolocator = Nominatim() 
location = geolocator.reverse("{}, {}".format(lat, lon)) 
dict = location.raw 
osmid = dict.get('osm_id', 'default_value_if_null_here') 
osmtype = dict.get('osm_type', 'default_value_if_null_here') 

if(osmtype == 'node'): 
    node_info = requests.get("http://api.openstreetmap.org/api/0.6/node/"+ osmid) 
    d = xmltodict.parse(node_info.content) 
    amenity_tags = [tag for tag in d['osm']['node']['tag'] if tag['@k'] == 'amenity'] 

    if len(amenity_tags) != 0: 
     print amenity_tags 

Я в принципе хочу, чтобы проверить, если местоположение, соответствующий узлу на OpenStreetMap, и если да, то проверить, если это удобства и какой тип удобств. Выход образца следующий:

[OrderedDict([(u'@k', u'amenity'), (u'@v', u'cafe')])] 
[OrderedDict([(u'@k', u'amenity'), (u'@v', u'fast_food')])] 
[OrderedDict([(u'@k', u'amenity'), (u'@v', u'bicycle_parking')])] 
[OrderedDict([(u'@k', u'amenity'), (u'@v', u'atm')])] 
[OrderedDict([(u'@k', u'amenity'), (u'@v', u'restaurant')])] 
[OrderedDict([(u'@k', u'amenity'), (u'@v', u'restaurant')])] 
[OrderedDict([(u'@k', u'amenity'), (u'@v', u'theatre')])] 

Мой вопрос в том, как бы я разделил этот упорядоченный словарь. Результат, на который я надеюсь, состоит в том, чтобы иметь переменную «amenity_type» = кафе, ресторан, театр и т. Д. ... Надеюсь, я объяснил, что мой вопрос достаточно. Я новичок в python, поэтому любая помощь будет оценена, спасибо!

+0

, так что вам нужен новый словарь из значений предыдущего? – Copperfield

+1

«переменная« amenity_type »= кафе, ресторан, театр и т. Д.» => это не четкое описание. Пожалуйста, опубликуйте ожидаемый результат для приведенного выше ввода образца ... –

+0

@brunodesthuilliers \t Я пробовал 'amenity_type = (amenity_tags [' @ v '])' например, я просто хочу иметь переменную amenity_type, так что если я чтобы напечатать amenity_type, он просто напечатал бы «ресторан», например – RyanKilkelly

ответ

1

Возможно, вы ищете класс. Класс дает вам возможность хранить сложные данные в одном ведро, так как может предоставлять пользовательские строковые сервисы, такие как форматирование для печати, даже позволяет определять операторы для объектов такого типа. Этот пример принимает (до) три переменные инициализации или через множество(), и будет выводить их при использовании ул()

#!/usr/bin/python 

class myThing(object): 
    def __init__(self,a='',b=0,c=[]): 
     self.set(a,b,c); 
    def set(self,a=None,b=None,c=None): 
     if a != None: self.a = a; 
     if b != None: self.b = b; 
     if c != None: self.c = c; 
    def __str__(self): 
     out = self.a + '\n' 
     out += str(self.b) + '\n' 
     out += str(self.c) + '\n' 
     return out 

if __name__ == "__main__": 
    x = myThing('boooga',42,[1,2,'Spaghetti and Pizza']) 
    print x 

    x.set(b=12) 
    print str(x) 

    print x.a 
    print str(x.b) 
    print str(x.c) 
    for el in x.c: 
     print el 

Если положить, что в файл и запустить его на консоли, получить:

boooga 
42 
[1, 2, 'Spaghetti and Pizza'] 

boooga 
12 
[1, 2, 'Spaghetti and Pizza'] 

boooga 
12 
[1, 2, 'Spaghetti and Pizza'] 
1 
2 
Spaghetti and Pizza 

Там много больше, вы можете с классом в этом ключе, но, возможно, поможет вам начать работу, если она соответствует вашим потребностям.

Я предполагаю, что вы используете Linux или OS X. Если это не будет выполняться ни в одном из них, введите which python на консоли и измените первую строку с /usr/bin/python на экземпляр, который он вам отчитается.

Это написано для Python 2-series. Python 3 - это что-то еще.

+0

- плохая идея использовать изменяемые объекты в качестве значения по умолчанию, это может привести к неожиданным результатам. Кроме того, вам не нужно определять установщик, если вам не нужно проверять данные. – Copperfield

+0

У меня никогда не было проблемы. Вы должны объяснить сами. При каких условиях эти значения по умолчанию могут вызвать проблему. Что касается set(), это пример, исходное место, вот и все. Дело в том, чтобы * начать * с этим, вы знаете, а не клонировать его. – fyngyrz

+0

использование значений mutables может вызвать проблему, если вы их модифицируете, и в этом случае следующий вызов функции увидит изменения, сделанные предыдущим вызовом или вне, если вы вернете это значение, и если это не намерение, проблема. Как упоминание здесь: [«Наименьшее удивление» в Python: аргумент аргумента по умолчанию] (http://stackoverflow.com/questions/1132941/least-astonishment-in-python-the-mutable-default-argument) и здесь [ Значения параметров по умолчанию в Python] (http://effbot.org/zone/default-values.htm # valid-uses-for-mutable-defaults) – Copperfield

Смежные вопросы