[英]Appropriate to use repeated function calls to loop through something (i.e. a list) in Python?
[英]Implement for loop: if values are changing, do something (i.e. make line)
我有以下三個列表:
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
為:
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 循環來做這個,但我不知道如何實現它說:如果值正在改變,那么停下來做一條線。
注意:問題不在於如何制作一行,而在於如何在實現中使用所有正確的值。
我希望我解釋得很好,有人可以幫助我,在此先感謝!
假設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
您可以使用zip來組合 3 個列表。
entries = zip(ov,participant,geom)
for entry in entries:
# for the first entry it should print 1,1,0101000020E864000077C385FFB4231C417F437ECE83E95441
print(entry)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.