我正在尝试在python中找到最有效的方法来创建'guids'字典(在rhino中指向id)并根据我分配它们的值检索它们,更改该值(s)和将它们恢复到字典中。一个问题是,使用Rhinoceros3d程序,这些点有一个随机生成的ID号,我不知道,所以我只能根据我给它们的值来调用它们。
字典是正确的方法吗? guids应该是值而不是键?
一个非常基本的例子:
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 :(得分: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中返回一个可迭代的视图而不是列表。
答案 1 :(得分: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
你的dict的密钥,但是你可以删除一个密钥并插入另一个密钥:
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...']}