遍历字典列表
我有一个字典的列表。这个列表里有几个点,有些点是重复的。当有重复的点时,我想计算这些点的x和y的平均值。我的问题是,我不知道怎么遍历这个字典列表来比较这些点的id!
当我用类似这样的代码时:
for i in list:
for j in list:
if i['id'] == j['id']:
point = getPoint(i['geom'])
....
抱歉,格式有点复杂……第二个循环是在第一个循环里面……我觉得它在比较列表的第一个条目,所以结果是一样的……所以我需要从第二个条目开始第二个循环,但我不能用i-1来做到这一点,因为i是整个字典……有没有人有什么想法?
谢谢大家!
for j in range(1, len(NEWPoint)):
if i['gid']==j['gid']:
allsamePoints.append(j)
for k in allsamePoints:
for l in range(1, len(allsamePoints)):
if k['gid']==l['gid']:
Point1 = k['geom']
Point2=l['geom']
X=(Point1.x()+Point2.x())/2
Y=(Point1.y()+Point2.y())/2
AVPoint = QgsPoint(X, Y)
NEWReturnList.append({'gid': j['gid'], 'geom': AVPoint})
del l
for m in NEWReturnList:
for n in range(1, len(NEWReturnList)):
if m['gid']==n['gid']:
Point1 = m['geom']
Point2=n['geom']
X=(Point1.x()+Point2.x())/2
Y=(Point1.y()+Point2.y())/2
AVPoint = QgsPoint(X, Y)
NEWReturnList.append({'gid': j['gid'], 'geom': AVPoint})
del n
else:
pass
好的,我觉得……现在这更让人困惑了 :)……
2 个回答
0
我不太确定你想要做什么,但我觉得列表过滤可能对你有帮助。Python里有一个内置的函数叫做 filter
,它会遍历一个序列,然后对每个项目调用你自己定义的函数,以决定是否把这个项目包含在结果列表里。
比如说:
def is4(number):
return number == 4
l = [1, 2, 3, 4, 5, 6, 4, 7, 8, 4, 4]
filter(is4, l) # returns [4, 4, 4, 4]
如果你有一个字典的列表,想要过滤掉所有某个条目等于给定值的字典,你可以这样做:
def filter_dicts(dicts, entry, value):
def filter_function(d):
if entry not in d:
return False
return d[entry] == value
return filter(filter_function, dicts)
使用这个函数,如果你想要获取所有 "id" 条目等于 2 的字典,你可以这样:
result = filter_dicts(your_list, "id", 2)
这样的话,你的主循环可能看起来像这样:
processed_ids = set()
for item in list:
id = item['id']
if id in processed_ids:
continue
processed_ids.add(id)
same_ids = filter_dicts(list, "id", id)
# now do something with same_ids
希望我理解得没错,这对你有帮助。
4
一种方法是改变你存储点数的方式,因为正如你已经注意到的那样,从中获取你想要的东西很困难。
一个更有用的结构是使用字典(dict),在这个字典中,id
对应一个点数的列表:
from collections import defaultdict
points_dict = defaultdict(list)
# make the new dict
for point in point_list:
id = point["id"]
points_dict[id].append(point['geom'])
def avg( lst ):
""" average of a `lst` """
return 1.0 * sum(lst)/len(lst)
# now its simple to get the average
for id in points_dict:
print id, avg( points_dict[id] )