且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

循环通过字典列表

更新时间:2022-10-17 21:31:22

一种方式将改变你存储积分的方式,因为你已经注意到,很难得到你想要的东西的。



一个更有用的结构将是一个dict,其中 id 映射到一个列表:

 从集合导入defaultdict 
points_dict = defaultdict(list)

#使新的dict
for point in point_list:
id = point [id]
points_dict [id] .append(point ['geom'])

def avg(lst) :
lst的平均值
返回1.0 * sum(lst)/ len(lst)

#现在简单得到平均
for point in points_dict:
print id,avg(points_dict [id])


i have a list of dictionaries. there are several points inside the list, some are multiple. When there is a multiple entry i want to calculate the average of the x and the y of this point. My problem is, that i don't know how to loop through the list of dictionaries to compare the ids of the points!

when i use something like that:

for i in list:
  for j in list:
    if i['id'] == j['id']:
      point = getPoint(i['geom'])
      ....

sorry, the formating is a little bit tricky... the second loop is inside the first one... i think it compares the first entry of the list, so it's the same... so i have to start in the second loop with the second entry, but i can't do that with i-1 because i is the hole dictionary... Someone an idea? thanks in advance!

 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

ok, i think... at the moment thats more confusing :)...

One way would be changing the way you store your points, because as you already noticed, it's hard to get what you want out of it.

A much more useful structure would be a dict where the id maps to a list of points:

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] )