2010-08-11 117 views
1

我有一個詞典的列表。列表中有幾個點,有些是多個點。當有多個條目時,我想計算這個點的x和y的平均值。我的問題是,我不知道如何遍歷字典列表來比較點的ID!循環詞典列表

當我使用類似的東西:

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

不好意思,格式化是有點棘手......第二個循環是第一位的內部... 我認爲它比較的第一個條目列表,所以它是一樣的...所以我必須在第二個條目的第二個循環中開始,但是我不能用i-1來做,因爲我是空洞字典... 有人想法嗎? 在此先感謝!

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 

好吧,我想......此刻那是更加令人困惑:)...

+0

你在用什麼語言? – Jonn 2010-08-11 12:42:13

+0

我正在使用python – aleho 2010-08-11 12:43:40

+0

如果三個或更多元素具有相同的「id」,會發生什麼?你想計算每對元素的平均值嗎?或者你是否想用相同的''id''來聚類所有的元素並且取平均值? – unutbu 2010-08-11 12:46:20

回答

4

一個辦法是改變你存儲你的觀點的方式,因爲你已經注意到了,這是很難得到你想要的東西。

一個更爲有用的結構將是一個字典,其中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]) 
+0

由於THC4k是正確的,我收回了我正處於寫作過程中的評論。一張指令清單根本不理想 - 更自然地,您有一個字典,您可以先將其刪除。 +1 但是,THC4k,如果你在代碼中加入瞭如何從列表中構建這樣一個字典,以便使OP更清晰,那將會很不錯。 – chryss 2010-08-11 13:08:08

+0

所以,當我去與points_dict [id] .append(...)我得到一個字典與幾個項目與不同IDS和幾何? 我想這樣做與詞典的列表,因爲我找不到任何東西存儲在一個字典中的幾個項目(如在Excel表中)... – aleho 2010-08-11 13:14:06

+2

通知'defaultdict(列表)'使用內置'列表'這就是爲什麼你應該從不**使用'list'作爲變量名稱 – 2010-08-11 13:17:18

0

我不能完全確定你想要做什麼,但我想過濾列表會幫助你。有內置函數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 

我希望我理解正確的,你並認爲這是對您有所幫助。

+0

哦,太棒了!非常感謝...看起來不錯...我必須再次閱讀並與我的嘗試! – aleho 2010-08-11 13:31:27

+0

它的工作!jipie! – aleho 2010-08-11 14:11:26