2012-11-22 162 views
0

我試圖找到最有效的方法在python中創建'guids'(犀牛中的點id)字典並根據我分配的值檢索它們他們,改變這個價值並將它們恢復到字典中。一個問題是,使用Rhinoceros3d程序時,點有一個隨機生成的ID號,我不知道,所以我只能根據我給他們的值調用它們。從字典中檢索密鑰取決於python中的值

是詞典的正確方法嗎? guid應該是價值而不是關鍵?

一個非常簡單的例子:

arrPts=[] 
arrPts = rs.GetPoints() # ---> creates a list of point-ids 

ptsDict = {} 
for ind, pt in enumerate(arrPts): 
    ptsDict[pt] = ('A'+str(ind)) 

for i in ptsDict.values(): 
    if '1' in i : 
     print ptsDict.keys() 

我怎麼能做出,而不是所有的按鍵上面的代碼打印一個值爲「1」鍵,?然後將該鍵的值從1改變爲例如2?

任何幫助也一般問題將不勝感激知道我在正確的方向。

感謝

帕烏

+0

當你說「鍵的值從1更改爲2,現在在那裏現在有兩個不同的'guid''具有相同的值(2)? – Gerrat

回答

2

您可以使用dict.items()

一個例子:

In [1]: dic={'a':1,'b':5,'c':1,'d':3,'e':1} 

In [2]: for x,y in dic.items(): 
    ...:  if y==1: 
    ...:   print x 
    ...:   dic[x]=2 
    ...:   
a 
c 
e 

In [3]: dic 
Out[3]: {'a': 2, 'b': 5, 'c': 2, 'd': 3, 'e': 2} 

dict.items()返回包含在python 2.x的鍵和值對元組的列表:

In [4]: dic.items() 
Out[4]: [('a', 2), ('c', 2), ('b', 5), ('e', 2), ('d', 3)] 

和在python 3.X它返回代替一個可迭代視圖列表。

+0

+1擊敗我9秒:) –

+0

實際上是1:09。 :P –

+0

噢。持續時間長。那麼,最好刪除我的答案,因爲你已經涵蓋了所有方面。 :) –

1

認爲你想GUID是值,而不是鍵,因爲它看起來像你想看到他們分配的東西。 ......但這取決於你的用例。

# list of GUID's/Rhinoceros3d point ids 
arrPts = ['D20EA4E1-3957-11d2-A40B-0C5020524153', 
      '1D2680C9-0E2A-469d-B787-065558BC7D43', 
      'ED7BA470-8E54-465E-825C-99712043E01C'] 

# reference each of these by a unique key 
ptsDict = dict((i, value) for i, value in enumerate(arrPts)) 
# now `ptsDict` looks like: {0:'D20EA4E1-3957-11d2-A40B-0C5020524153', ...} 

print(ptsDict[1]) # easy to "find" the one you want to print 

# basically make both keys: `2`, and `1` point to the same guid 
# Note: we've just "lost" the previous guid that the `2` key was pointing to 
ptsDict[2] = ptsDict[1] 

編輯:

如果你使用一個元組爲重點,以你的字典,它看起來是這樣的:

ptsDict = {(loc, dist, attr3, attr4): 'D20EA4E1-3957-11d2-A40B-0C5020524153', 
      (loc2, dist2, attr3, attr4): '1D2680C9-0E2A-469d-B787-065558BC7D43', 
      ... 
      } 

如你所知,元組是不可改變的,所以你不能change你的字典的關鍵,但你可以刪除一個密鑰,並插入另一個:

oldval = ptsDict.pop((loc2, dist2, attr3, attr4)) # remove old key and get value 
ptsDict[(locx, disty, attr3, attr4)] = oldval # insert it back in with a new key 

爲了有一個關鍵點多個值,你就必須使用列表或設置爲包含的GUID:

{(loc, dist, attr3, attr4): ['D20E...', '1D2680...']} 
+0

您好,格拉特,感謝您的回覆!我不太明白爲什麼我應該讓'2'和'1'指向同一個GUID。但在任何情況下,我是否可以用您的示例在鍵中存儲更多信息而不僅僅是一個數字?我有大約4個屬性,我需要通過各種條件來查看,如果符合,然後檢索GUID。 –

+0

@Pav:我不是真的「暗示」你讓他們指向同一個 - 我只是不確定你想要做什麼。你當然可以在鍵中存儲比數字更多的信息(請參閱@ Don的回答,他提到了使用元組)。有4個屬性需要查看,你應該使用一個元組作爲關鍵字)。你提到想要將鍵值從1改爲2 - 那部分是我們中的一些人試圖理解你的意思。 – Gerrat

+0

嗨Gerratt再次,每個點有4個值取決於位置,距離otherd和其他屬性,我不應該打擾你與。通過這些屬性,我需要搜索並獲得與我想要的匹配的GUID。但是這些屬性會改變,例如。距離,位置,所以我需要更新密鑰。希望我更清楚。一個元組,因爲正確,但它不是不變的?意思我不能改變它們?對不起,太多的文字,即時新! –