Python 循环实现:如果值正在更改,则执行某些操作(即,生成行)

Python 循环实现:如果值正在更改,则执行某些操作(即,生成行),python,python-3.x,for-loop,Python,Python 3.x,For Loop,我有以下三个清单: 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',

我有以下三个清单:

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作为点,线通常在ov为1时开始,在ov为0时结束

除非参与者改变,否则新行开始

所以在我的例子中,我想使用geom创建线串,ov为:

我曾想过使用for循环来实现这一点,但我不知道如何实现它,比如说:如果值正在更改,那么停止并生成一行

注意:问题不在于如何生成一行,而在于如何在实现中使用所有正确的值

我希望我解释的很好,有人可以帮助我,提前谢谢

您可以使用来组合这3个列表

entries = zip(ov,participant,geom)
for entry in entries:
    # for the first entry it should print 1,1,0101000020E864000077C385FFB4231C417F437ECE83E95441
    print(entry)
假设参与者始终处于排序状态,请使用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

用几何图形作为点是什么意思?我认为几个for循环和if-else检查可以解决这个问题。通过画一条线,你的意思是画一个线图?还是打印文本行?当然,geom是如何编码的看起来像十六进制的,现在还不太清楚,但我们如何从中获取点呢?以及如何在那里使用。geom中的条目是点坐标。我知道如何使一行成为一行字符串,但我不知道如何在给定的条件下做到这一点。。。这对for循环和if-else检查是我真正想要的;geom中的数据似乎与您的预期输出无关,仅使用ov和参与者即可获得。哈哈,我知道,但确实如此。如果这些条件适用,我想为每个参与者制作不同的线路。因此,对于第一行,它使用ov列表的第一项和第二项,它还应该使用geom列表的第一项和第二项来生成一个linestring,因为我的行有一个条件,ov以1开始,以0结束。是的,我已经这样做了,但我不知道如何实现上述不同的条件。。。
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