Реализуйте цикл: если значения меняются, что-то делаете (то есть делайте строки) - PullRequest
0 голосов
/ 18 марта 2019

У меня есть следующие три списка:

ov = [1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1]

participant = [1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4]

geom = ['0101000020E864000077C385FFB4231C417F437ECE83E95441', '0101000020E8640000F532AC46BA231C41A945335C84E95441', '0101000020E8640000CD138FFA46EA1A41C71D074C27E15441', '0101000020E864000087373742A94A1A41B6A39D38B0815441', '0101000020E86400003A60EE21A3231C41ACB8FFA584E95441', '0101000020E864000046717DBEB2231C4115840F5D84E95441', '0101000020E8640000AAAF4E36AB231C413AC5EB5D84E95441', '0101000020E8640000B84BD7B961231C41D245C83B85E95441', '0101000020E864000026940AB784231C417B5D79A984E95441', '0101000020E86400003FE809B587231C4102DB987E85E95441', '0101000020E8640000B8FC550A83231C41E5B0F93785E95441', '0101000020E8640000E1A849F9A1231C41009C21A684E95441', '0101000020E8640000E1A849F9A1231C41009C21A684E95441', '0101000020E864000066EB7C29A0231C41F29756A684E95441', '0101000020E86400009B3CC349DC711C41EE7E428C76E15441', '0101000020E86400008985282945681C4182B65E6F50DC5441', '0101000020E86400005B469B1AB1711C410553435A76E15441']

Теперь я хотел бы создать линии при следующих условиях:

  • , используя geom в качестве точек, aСтрока обычно начинается, когда ov равен 1, и заканчивается, когда ov равен 0

  • , за исключением случаев, когда участник меняется, тогда начинается новая строка

Так что в моем случае я хотел бы создать линейные строки, используя geom с ov:

linestring 1: 1, 0
linestring 2: 1, 1, 1, 1, 1, 0
linestring 3: 1, 1, 1, 0
linestring 4: 1, 1, 1
linestring 5: 1, 1

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

Примечание: проблема не в том, как сделать линию, а в том, как использовать все правильные значения вреализация.

Надеюсь, я все объяснил, и кто-нибудь может мне помочь, заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 18 марта 2019

Предполагая, что participant всегда сортируется, используйте itertools.groupby для группировки элементов в соответствии с его элементами:

for k, g in groupby(zip(participant, ov, geom), itemgetter(0)):
    # k: element of participant
    # g: all (participant, ov, geom) items corresponding to k

Чтобы напечатать каждую строку, отделите элементы (ov, geom) от g (итератор) и объедините запятыми:

# each (ov, geom) --> "ov, geom"
line = ', '.join(map(lambda x: str(x[1])+', '+x[2], g))

Полный код:

from itertools import groupby
from operator import itemgetter

for k, g in groupby(zip(participant, ov, geom), itemgetter(0)):
    print('linestring %i:' % k, ', '.join(map(lambda x: '%s, %i' % x[1:], g)))

Вывод:

linestring 1: 1, 0101000020E864000077C385FFB4231C417F437ECE83E95441, 0, 0101000020E8640000F532AC46BA231C41A945335C84E95441
linestring 2: 1, 0101000020E8640000CD138FFA46EA1A41C71D074C27E15441, 1, 0101000020E864000087373742A94A1A41B6A39D38B0815441, 1, 0101000020E86400003A60EE21A3231C41ACB8FFA584E95441, 1, 0101000020E864000046717DBEB2231C4115840F5D84E95441, 1, 0101000020E8640000AAAF4E36AB231C413AC5EB5D84E95441, 0, 0101000020E8640000B84BD7B961231C41D245C83B85E95441
linestring 3: 1, 0101000020E864000026940AB784231C417B5D79A984E95441, 1, 0101000020E86400003FE809B587231C4102DB987E85E95441, 1, 0101000020E8640000B8FC550A83231C41E5B0F93785E95441, 0, 0101000020E8640000E1A849F9A1231C41009C21A684E95441, 1, 0101000020E8640000E1A849F9A1231C41009C21A684E95441, 1, 0101000020E864000066EB7C29A0231C41F29756A684E95441, 1, 0101000020E86400009B3CC349DC711C41EE7E428C76E15441
linestring 4: 1, 0101000020E86400008985282945681C4182B65E6F50DC5441, 1, 0101000020E86400005B469B1AB1711C410553435A76E15441

Печать каждой пары элементов на отдельных строках для наглядности:

linestring 1:
   1, 0101000020E864000077C385FFB4231C417F437ECE83E95441
   0, 0101000020E8640000F532AC46BA231C41A945335C84E95441
linestring 2:
   1, 0101000020E8640000CD138FFA46EA1A41C71D074C27E15441
   1, 0101000020E864000087373742A94A1A41B6A39D38B0815441
   1, 0101000020E86400003A60EE21A3231C41ACB8FFA584E95441
   1, 0101000020E864000046717DBEB2231C4115840F5D84E95441
   1, 0101000020E8640000AAAF4E36AB231C413AC5EB5D84E95441
   0, 0101000020E8640000B84BD7B961231C41D245C83B85E95441
linestring 3:
   1, 0101000020E864000026940AB784231C417B5D79A984E95441
   1, 0101000020E86400003FE809B587231C4102DB987E85E95441
   1, 0101000020E8640000B8FC550A83231C41E5B0F93785E95441
   0, 0101000020E8640000E1A849F9A1231C41009C21A684E95441
   1, 0101000020E8640000E1A849F9A1231C41009C21A684E95441
   1, 0101000020E864000066EB7C29A0231C41F29756A684E95441
   1, 0101000020E86400009B3CC349DC711C41EE7E428C76E15441
linestring 4:
   1, 0101000020E86400008985282945681C4182B65E6F50DC5441
   1, 0101000020E86400005B469B1AB1711C410553435A76E15441
0 голосов
/ 18 марта 2019

Вы можете использовать zip , чтобы объединить 3 списка.

entries = zip(ov,participant,geom)
for entry in entries:
    # for the first entry it should print 1,1,0101000020E864000077C385FFB4231C417F437ECE83E95441
    print(entry)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...