У меня есть файл JSON, и он представляет собой вложенный список типа A. (Извините, это был словарь)
В координатах, где первый элемент (1.1) содержит координаты x, второй элемент (2.2) содержит координаты y, а третий элемент (3.3) содержит координаты z для точки. И еще 3 пункта, следующие за первым пунктом, — это точки списка площади здания. Итак, точка 4 в списке соответствует кривой контура здания при создании линий.
Во вторых данных, выделенных жирным шрифтом, есть 2 подсписка. Это означает, что данные о контуре здания имеют 2 полигона.
A =
{
"type": "FeatureCollection",
"name": "PROJECT CRS TM 30",
"features": [
{ "type": "Feature", "properties": { "OBJECTID": 0, "ROOF_NUMBER": null, "STOREY": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 1.1, 2.2, 3.3 ], [ 4.4, 5.5,6.6 ], [ 7.7, 8.8, 9.9 ], [ 10.10, 11.11, 12.12 ] ] ] ] } },
{ "type": "Feature", "properties": { "OBJECTID": 2215889.0, "ROOF_NUMBER": null, "STOREY": 4 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 13.13, 14.14, 15.15], [ 16.16, 17.17, 18.18 ], [ 19.19, 20.20, 21.21 ], **[ [ [ 22.22, 23.23, 24.24 ], [ 25.25, 26.26, 27.27 ], [ 28.28, 29.29, 30.30 ], [ 31.31, 32.32, 33.33 ] ] ] ] } }**,
]
}
Я хотел бы получить список, состоящий из значений x точек, и я хотел бы получить их, не меняя подсписок зданий. Например, Б:
B = [[[[1.1], [4.4], [7.7], [10.10]]],[[[13.13], [16.16], [19.19]],[[22.22], [25.25], [28.28], [31.31]]]]
где каждый список представляет значение x точек. и каждая функция имеет свои собственные подсписки.
Я получаю список типа C, когда пишу этот код в программном обеспечении визуального программирования BIM.
get_data_values["features"]["geometry"]["coordinates"][0];
С= [[ 13.13, 14.14, 15.15], [ 16.16, 17.17, 18.18 ], [ 19.19, 20.20, 21.21 ] , **[ [ 22.22, 23.23, 24.24 ], [ 25.25, 26.26, ], [ 28,28 , 29.29, 30.30 ], [ 31.31, 32.32, 33.33 ] ] ** ]
После получения C я использовал приведенный ниже код, чтобы получить список B.
def Extract(lst):
second_items = []
for sublst in lst:
for secsublst in sublst:
for thirdsublst in secsublst:
second_item = []
for item in thirdsublst:
second_items.append(second_item)
if item:
second_item.append(item[1])
return second_items
Итак, когда я пробую это, я получаю значения x для каждого объекта, но я понял, что в данных есть 9835 объектов, но в итоге я получаю только 84296 объектов.
Файл JSON имеет функцию 9835, что означает, что в нем находится информация о 9835 зданиях. А в некоторых объектах есть два разных полигона контура.
[]
Число, которое я получаю, — 84296, когда я использую Extract Def. Это означает, что я получаю меньше зданий.
[]
[
]
Как я могу получить функцию 9835, например B? Я искал по форуму, но не смог решить свою проблему, так как я новичок.
Спасибо за ваше время и руководство.
Весь процесс выглядит так.
Спасибо, Грисмар! это словарь, и я сделаю выдержки меньшими заглавными буквами. Я еще раз отредактировал вопрос. На последней фотографии справа виден файл JSON. И когда я пишу в блоке кода get_data_values и подсписок в скобках, я думаю, я получаю вложенный список. а затем я применил код слева и получил результаты в узле сценария Python, который показан посередине ниже.
Вы можете использовать рекурсивную функцию для обхода и репликации структуры вложенного списка и заполнения новой структуры только первым значением.
def flatten_coords(el):
if el == []:
return el
if isinstance(el[0], list):
return [flatten_coords(el[0])] + flatten_coords(el[1:])
return el[:1]
x_coords = []
for feature in A["features"]:
x_coords.append(flatten_coords(feature["geometry"]["coordinates"]))
print(x_coords)
Выход:
[[[[[1.1], [4.4], [7.7], [10.1]]]], [[[[13.13], [16.16], [19.19], [[[22.22], [25.25], [28.28], [31.31]]]]]]]
Большое спасибо! Я пытаюсь сейчас. После этого я проверяю ответ.
A
— это не «вложенный список», а словарь. Пожалуйста, поделитесь кодом, который вы на самом деле используете. (т. е. с помощью чего вы вызываетеExtract
). Кроме того, имейте в виду, что идентификаторы, начинающиеся с заглавной буквы в Python, обычно рассматриваются как имена классов, но, похоже, вы хотите использовать их как имя функции, поэтомуextract
было бы лучше - хотя более описательное было бы еще лучше.