Отображение двух разных JSON результатов в одной строке - PullRequest
0 голосов
/ 12 марта 2020

Я новичок в JSON, API Карт Google DistanceMatrix & Places
Я пытаюсь отобразить результаты двух разных JSON Результатов

В основном оба они происходят из двух разных "lists"

edit
для object_json Я получаю все близлежащие места из моих координат, затем я получу place_id каждого результата и использую его для запроса расстояния -матрица api и получить каждое из расстояний object_json2

код

    #name and types from Places API
    lines = (f"{s['name']}: {', '.join(r.replace('_', ' ') for r in s['types'])} -" for s in object_json['results'][0:5])
    #distance from DistanceMatrix API
    lines2 = (f"{t['distance']['text']}" for t in item['elements'] for item in object_json2['rows']) 

образец JSON object_ json: получение имени, типов и мест_идентификатора

   "results" : [
      {
         "name" : "Joe’s Thai Kitchen",
         "place_id" : "ChIJIadbw8sb2jER3i-OvZSCBGk",
         "types" : [ "restaurant", "food", "point_of_interest", "establishment" ],
      },

object_json2 на основании результатов поиска поблизости, он получит place_id и результаты матрицы расстояний для каждого расстояния элементов.

"rows" : [
      {
         "elements" : [
            {
               "distance" : {
                  "text" : "0.3 km",
                  "value" : 303
               },
               "duration" : {
                  "text" : "2 mins",
                  "value" : 123
               },
               "status" : "OK"
            },
            {
               "distance" : {
                  "text" : "90 m",
                  "value" : 90
               },
               "duration" : {
                  "text" : "1 min",
                  "value" : 36
               },
               "status" : "OK"
            }
         ]
      }
   ],

Первые два результата

Joe’s Thai Kitchen: restaurant, food, point of interest, establishment - ['0.4 km', '77 m', '0.3 km', '0.8 km', '0.3 km']

Hong Kong Street Chun Kee: restaurant, food, point of interest, establishment - ['0.4 km', '77 m', '0.3 km', '0.8 km', '0.3 km']

Желаемые первые два результата

Joe’s Thai Kitchen: restaurant, food, point of interest, establishment - 0.4 km
Hong Kong Street Chun Kee: restaurant, food, point of interest, establishment - 77 m

Надеюсь, кто-то может помочь, спасибо.

1 Ответ

0 голосов
/ 19 марта 2020

Во-первых, я не думаю, что вы правильно интерпретируете результаты API Distance Maxtrix. Это также приводит к проблеме XY .

Но в любом случае, что вы действительно хотите сделать, так это объединить результаты двух списков в object1 и object2. Вы можете сделать это с помощью zip(). zip() принимает каждое повторяемое значение и возвращает кортеж из каждого списка 'n th элемент. И останавливается на самом коротком:

>>> list(zip('ABCD', 'xyz'))
[('A', 'x'), ('B', 'y'), ('C', 'z')]

Предполагая, что object_json выглядит следующим образом:

object_json = {
    "results" : [
        {
            "name" : "Joe’s Thai Kitchen",
            "place_id" : "ChIJIadbw8sb2jER3i-OvZSCBGk",
            "types" : [ "restaurant", "food", "point_of_interest", "establishment" ],
        },
        {
            "name" : "Hong Kong Street Chun Kee",
            "place_id" : "KgbcszVo-I3reJ2BS8WBDAijiHc",
            "types" : [ "restaurant", "food", "point_of_interest", "establishment" ],
        }
    ]
}

Использование object_json2 в соответствии с вашим примером:

>>> lines = (f"{s['name']}: {', '.join(r.replace('_', ' ') for r in s['types'])} -" for s in object_json['results'][0:5])
>>> lines2 = (f"{t['distance']['text']}" for item in object_json2['rows'] for t in item['elements'])
>>>
>>> [' '.join((x, y)) for x, y in zip(lines, lines2)]
['Joe’s Thai Kitchen: restaurant, food, point of interest, establishment - 0.3 km',
 'Hong Kong Street Chun Kee: restaurant, food, point of interest, establishment - 90m'
]

(Кстати, в вашем коде эта строка является синтаксической ошибкой: lines2 = (f"{t['distance']['text']}" for t in item['elements'] for item in object_json2['rows']). 2-й для l oop должен стоять первым.)

...