2016-09-24 3 views
0
import json, os 

def load_data(filepath): 
    if not os.path.exists(filepath): 
     return None 
    with open(filepath, 'r') as file: 
     return json.load(file) 

def get_biggest_bar(data): 
    bars = [] 
    for bar in data: 
     bars.append((bar['Cells']['SeatsCount'] , bar['Number'])) 
    max_number = max(bars)[1] 
    (item for item in data if item['Number'] == max_number).__next__()  
    return item, max_number 

def get_smallest_bar(data): 
    bars = [] 
    for bar in data: 
     bars.append((bar['Cells']['SeatsCount'] , bar['Number'])) 
    min_number = min(bars)[1] 
    (item for item in data if item['Number'] == min_number).__next__()  
    return item, min_number 

def get_closest_bar(data, longitude, latitude): 
    coordinates = [] 
    def get_distance(point, input_point): 
     return ((longitude-input_point[0])**2 + (latitude - input_point[1])**2)**1/2 
    for cell in data: 
     coordinates.append([cell['Cells']['geoData']['coordinates'],cell['Number']]) 
    for coor in coordinates: 
     coor[0] = get_distance(point, coor[0]) 
    closest_bar = min(coordinates)[1] 
    (item for item in data if item['Number'] == closest_bar).__next__() 
    return item, closest_bar 

if __name__ == '__main__': 
    data = load_data("Bars.json") 
    print(get_smallest_bar(data)) 
    print(get_biggest_bar(data)) 
    print(get_closest_bar(data, 50.0, 50.0)) 

에서 같은 항목을 반환 그리고 그것은 출력은 : 당신이 본대로다른 기능 파이썬 사전

(dict_values(['Семёновский переулок, дом 21', 'нет', 'район Соколиная Гора', 'Восточный административный округ', 'да', 177, {'type': 'Point', 'coordinates': [37.717115000077776, 55.78262800012168]}, 'СПБ', 272459722, [{'PublicPhone': '(916) 223-32-98'}], 'SПБ']), 37) 
(dict_values(['Семёновский переулок, дом 21', 'нет', 'район Соколиная Гора', 'Восточный административный округ', 'да', 177, {'type': 'Point', 'coordinates': [37.717115000077776, 55.78262800012168]}, 'СПБ', 272459722, [{'PublicPhone': '(916) 223-32-98'}], 'SПБ']), 434) 
(dict_values(['Семёновский переулок, дом 21', 'нет', 'район Соколиная Гора', 'Восточный административный округ', 'да', 177, {'type': 'Point', 'coordinates': [37.717115000077776, 55.78262800012168]}, 'СПБ', 272459722, [{'PublicPhone': '(916) 223-32-98'}], 'SПБ']), 170) 

이 항목 COMPLETLY 동일하지만, 그들은 diffrent 있습니다 (I는 기능으로 나눔하고이를 실행하려고 seperatly, 그리고 그들은 다른 항목을 출력)! 또한 fucntion의 반환에서 두 번째 숫자를 볼 수 있습니다 - 그들은 다릅니다! 무슨 일이야?!

+0

이것은 기능이 고장 났음을 나타냅니다. 정확성을 확인하기 위해 철저히 테스트 했습니까? – Carcigenicate

+0

내가 게시물에서 말했듯이, 나는 seperatly를 달리게하려고 노력했다. 그리고 그들은 fine 일했다! 또한, 각 함수의 반환에서 항목 번호가 반환되며 서로 다릅니다. –

+0

"filename"이 없으므로 일부 테스트 데이터를 작성했습니다. 그들이 잘 작동한다고 생각하면 그렇지 않습니다. 그들은 당신이 그것을 실행할 때 올바른 일이 일어나는 어떤 전역 변수를 리턴합니다. –

답변

1

당신은 항목을 얻기 위해 발전기를 사용하고 있지만 다음 줄에는 그 변수가 생각하는 것과 다릅니다. 발전기 내부의 항목이 범위를 벗어났습니다. 나는 실제 생성 된 값을 반환하는 것을 선호합니다. 또한 가장 가까운 막대가 어느 지점에 있지만 함수에 전달 된 막대는 아닙니다.

따라서 아이템과 포인트는 실수로 함수 내부에서 사용하는 전역 변수라고 생각합니다.

저는 python2.7을 가지고 있으므로 생성기에서 다음 값을 얻기위한 구문이 약간 다를 수 있습니다.

def load_data(filepath): 
    data = [ 
     {'Number': 10, 'Cells': {'SeatsCount': 10, 'geoData': {'coordinates': (10, 10)}}}, 
     {'Number': 50, 'Cells': {'SeatsCount': 50, 'geoData': {'coordinates': (50, 50)}}}, 
     {'Number': 90, 'Cells': {'SeatsCount': 90, 'geoData': {'coordinates': (90, 90)}}} 
    ] 
    return data 

def get_biggest_bar(data): 
    bars = [] 
    for bar in data: 
     bars.append((bar['Cells']['SeatsCount'] , bar['Number'])) 
    max_number = max(bars)[1] 
    g = (item for item in data if item['Number'] == max_number) 
    return next(g), max_number 

def get_smallest_bar(data): 
    bars = [] 
    for bar in data: 
     bars.append((bar['Cells']['SeatsCount'] , bar['Number'])) 
    min_number = min(bars)[1] 
    g = (item for item in data if item['Number'] == min_number) 
    return next(g), min_number 

def get_closest_bar(data, longitude, latitude): 
    point = (longitude, latitude) 
    coordinates = [] 
    def get_distance(point, input_point): 
     return ((longitude-input_point[0])**2 + (latitude - input_point[1])**2)**1/2 
    for cell in data: 
     coordinates.append([cell['Cells']['geoData']['coordinates'],cell['Number']]) 
    for coor in coordinates: 
     coor[0] = get_distance(point, coor[0]) 
    closest_bar = min(coordinates)[1] 
    g = (item for item in data if item['Number'] == closest_bar) 
    return next(g), closest_bar 

if __name__ == '__main__': 
    data = load_data("Bars.json") 
    print("smallest", get_smallest_bar(data)) 
    print("biggest", get_biggest_bar(data)) 
    print("closest", get_closest_bar(data, 50.0, 50.0)) 

출력 :

('smallest', ({'Cells': {'geoData': {'coordinates': (10, 10)}, 'SeatsCount': 10}, 'Number': 10}, 10)) 
('biggest', ({'Cells': {'geoData': {'coordinates': (90, 90)}, 'SeatsCount': 90}, 'Number': 90}, 90)) 
('closest', ({'Cells': {'geoData': {'coordinates': (50, 50)}, 'SeatsCount': 50}, 'Number': 50}, 50)) 
+0

범위에 대한 아이디어는 이해하지만 'item'과'point'에 대한 단어는 혼란 스럽습니다. generetor 다음에 행이 정확히 나오는 곳에서'item' 값을 가져 옵니까? –

+0

다른 방법으로 말해 보겠습니다. 이러한 기능만으로 테스트하십시오. 항목이 없습니다. 아무 의미가 없습니다. 함수를 (있는 그대로) 독립적으로 테스트하면 테스트에서 잘못된 점을 빨리 알 수 있습니다. –

1

이 같은 그것을 반환하기 전에 __next__()에 호출의 결과를 할당합니다

result = (item for item in data if item['Number'] == closest_bar).__next__() 
return result, closest_bar 
1

잘못 부여 된 무슨 일이 있었는지 답변. 제 생각에 min과 max를 검색하는 코드는 "pythonic"이 아니 었습니다. 나는 또 다른 접근 방식 제안하고 싶습니다 :

(케니 오 스트롬의 대답에서 사용 된 샘플 데이터) 원래 코드에서 get_distance에 따라 간단한 사용자 정의 키 기능이 요구되는 가장 가까운 바

data = [ {'Number': 10, 'Cells': {'SeatsCount': 10, 'geoData': {'coordinates': (10, 10)}}}, 
     {'Number': 50, 'Cells': {'SeatsCount': 50, 'geoData': {'coordinates': (50, 50)}}}, 
     {'Number': 90, 'Cells': {'SeatsCount': 90, 'geoData': {'coordinates': (90, 90)}}} ] 

biggest = max(data, key=lambda bar: bar['Cells']['SeatsCount']) 
smallest = min(data, key=lambda bar: bar['Cells']['SeatsCount']) 

을하지만, 너는 그 생각을 가지고있어.

+0

나는 당신이 좌석 수를 사용하고 있다고 생각합니다. –

+0

@KennyOstrom : 실수를 찾아 주셔서 감사합니다. 코드를 업데이트했습니다. – VPfB