0

我试图在python中找到最有效的方法来创建'guids'字典(犀牛中的点id)并根据我分配的值检索它们,更改该值并将它们恢复回来在字典里。一个问题是,对于 Rhinoceros3d 程序,这些点有一个随机生成的 ID 号,我不知道,所以我只能根据我给它们的值来调用它们。

字典是正确的方法吗?指南应该是值而不是键吗?

一个非常基本的例子:

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 ?

如果知道我的方向正确,我们将不胜感激有关一般问题的任何帮助。

谢谢

帕夫

4

2 回答 2

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 中,它返回一个可迭代的视图而不是列表。

于 2012-11-22T21:12:48.723 回答
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]

编辑:

如果您要使用元组作为 dict 的键,它看起来像:

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...']}
于 2012-11-22T21:33:33.707 回答