根据python中的值从字典中检索键

时间:2012-11-22 21:09:46

标签: python list dictionary

我正在尝试在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?

对于一般问题的任何帮助都将被理解,我知道我正朝着正确的方向前进。

由于

帕乌

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...']}