gpt4 book ai didi

python - 在 geojson 文件中删除带有 for 循环的元素

转载 作者:行者123 更新时间:2023-12-04 08:23:06 24 4
gpt4 key购买 nike

对于 .geojson lambda 文件:

{ "type": "FeatureCollection",
"features": [
{ "type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [102.0, 0.5]
},
"properties": {
"label": "value0",
...
}
},
{ "type": "Feature",
"geometry": {..
我想删除具有键 'label' 的“点”和“多边形”甚至“MultiPolygon”类型的结构在 properties .
   import json

file = open('file.geojson', 'r')
data = json.load(file)

for k in data['features']:
if 'label' in k['properties']:
print('ok') #displays the right number of structure, so the loop works
del k #doesn't work
#data['features'].remove(k) works but delete only a part of elements in the file..
print('okk') #displays so del doesn't work

data_srt = open('file.geojson', 'w')
data_srt.write(json.dumps(data, ensure_ascii=False, indent=2))
data_srt.close()
这些解决方案不起作用,为什么?非常感谢。

最佳答案

考虑这个例子:

l = [1, 2, 3]
for i in l:
l.remove(i)

print(l) # Prints '[2]'
在第一次迭代期间 i == l[0] . l.remove(i)然后将与 l.remove(l[0]) 相同.在第二次迭代期间, i == l[1] .不过,在这一点上, l == [2, 3] , 因为 l[0]去掉了。因此,在第二次迭代中, l.remove(i)l.remove(l[1]) 相同.执行完后, l == [2] .如果循环尝试继续第三次迭代, i == l[2] .然而,现在 l == [2] , len(l) == 1所以 l[2]越界了。正因为如此, for循环现在停止,即使 l不是空的。这基本上与您遇到的问题相同。
要解决此问题:
i = len(l) - 1
while i >= 0:
l.remove(l[i])
i -= 1
像这样向后迭代列表避免了之前遇到的越界问题。
要在您的情况下应用此概念, 这就是解决方案 :
i = len(data["features"]) - 1
while i >= 0:
if "label" in data["features"][i]["properties"]:
data["features"].pop(i)
i -= 1
我刚刚想出了一个新的, 更好的解决方案 (它使用 reversed() 函数):
for k in reversed(data["features"]):
if "label" in k["properties"]:
data["features"].remove(k)
这使用了相同的反向迭代概念,但 reversed()函数会为您处理这些。 del的原因语句对你来说没有任何功能是由一个更复杂的概念引起的。我会尽力解释(这是另一个有助于解释它的答案: https://stackoverflow.com/a/14814847/13911868 )。
for 中遍历列表或任何容器时循环,像这样:
l = [1, 2, 3]
for i in l:
del i
i变量是深 复制 l 中的项目, 不是引用 .既然如此, del i只会删除复制的项目,不会删除 l 中的原始项目.
另一方面,在这个例子中:
l = [1, 2, 3]
for i in range(len(l)):
del l[i]
del l[i]将删除 l 中的原始项目因为 l[i]返回 原版对象, 不是副本 .
但是在这个例子中,你会遇到和以前一样的越界问题,所以一个有效的 使用 del 的解决方案声明将是:
for k in reversed(range(len(data["features"]))):
if "label" in data["features"][k]["properties"]:
del data["features"][k]

关于python - 在 geojson 文件中删除带有 for 循环的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65401766/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com