Python Script, чтобы найти самые низкие координаты в списке - PullRequest
0 голосов
/ 05 июля 2018

У меня есть список, содержащий координаты в порядке Y, X, Z. Я пытаюсь использовать python, чтобы найти координаты для самого низкого значения Z. Список содержит 4 набора координат, разделенных пробелом. Часть кода, который я использую, приведена ниже.

<gml:coordList>200.0001 400.0001 30.0001 210.0002 410.0002 31.0002 190.0003 401.0003 29.0003 213.0004 402.0004 38.0004</gml:coordList>


y1,x1,z1,y2,x2,z2,y3,x3,z3,y4,x4,z4 = coordList[0:-1].split(' ')

list1 = []

list1.append((z1,y1,x1))
list1.append((z2,y2,x2))
list1.append((z3,y3,x3))
list1.append((z4,y4,x4))
minz = min((list1))
x, y, z = minz[0:-1].split(' ') 

Я получаю следующую ошибку: AttributeError: у объекта 'tuple' нет атрибута 'split'

Могу ли я знать, почему я получаю ошибку и есть ли лучший способ достичь моей цели?

Спасибо

Ответы [ 3 ]

0 голосов
/ 05 июля 2018

Функция min, используемая в списке кортежей, сортирует кортежи, сравнивая все элементы в кортежах по одному, и не будет работать, если вы просто хотите отсортировать по одному из элементов в кортеже. , Вы должны использовать аргумент key со значением z каждого кортежа для функции min, чтобы отсортировать список и найти самое низкое значение.

coordList = '200.0001 400.0001 30.0001 210.0002 410.0002 31.0002 190.0003 401.0003 29.0003 213.0004 402.0004 38.0004'
y1,x1,z1,y2,x2,z2,y3,x3,z3,y4,x4,z4 = map(float, coordList[0:-1].split(' '))
list1 = []
list1.append((z1,y1,x1))
list1.append((z2,y2,x2))
list1.append((z3,y3,x3))
list1.append((z4,y4,x4))
z, y, x = min(list1, key=lambda c: c[0])
print(x, y, z)

Это выводит:

401.0003 190.0003 29.0003
0 голосов
/ 05 июля 2018

У вас есть ряд проблем с вашим кодом:

  • Вы split() a tuple, что является ошибкой
  • Вы сравниваете строки, чтобы получить лексический порядок, а не числовой
  • Вы излишне нарезаете свои последовательности, которые создают ненужные дубликаты

Чтобы извлечь ваши данные и преобразовать в float s:

y1,x1,z1,y2,x2,z2,y3,x3,z3,y4,x4,z4 = map(float, coordList.split())
list1.append((...))
...

Однако, это не очень общий подход, более общий подход состоит в том, чтобы просто сгруппировать split() в тройки:

list1 = []
for y, x, z in zip(*[map(float, coordList.split())]*3):
    list1.append((z, y, x))

Примечание. Предполагается, что Py3 в Py2 обернет вызов map(...) с помощью iter(map(...)).

Вы можете сохранить координаты в том же порядке и использовать key arg для min(), например ::

list1 = list(zip(*[map(float, coordList.split())]*3))
y, x, z = min(list1, key=lambda x: x[2])

Результат:

x, y, z   # (401.0003, 190.0003, 29.0003)
0 голосов
/ 05 июля 2018

Если minz уже является типом кортежа, вы можете назначить x, y, z каждому значению кортежа.

z, y, x = minz
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...