我有两个从pyodbc
结果创建的字典对列表,看起来像
results1 = [{'TextID': u'12345', 'RecID': 10203040},{'TextID': u'54321', 'RecID': 12131415}]
results2 = [{'TextID': u'55555', 'RecID': 98979654},{'TextID': u'78909', 'RecID': 78978978}]
第一个列表包含约60000个项目,第二个列表包含约15000个项目。
从arcpy
游标我想根据游标中的2个现有字段查找两个列表中的值。游标使用的数据集大约有50000条记录。
for row in cursor:
row[2] = results1.lookup(row[0])
row[3] = results2.lookup(row[1])
cursor.updateRow(row)
其中row[2] = results1.lookup(row[0])
在TextID
列表/字典中查找results1
并从字典对中返回RecID
。 row[0]
中的值包含TextID
中记录的results1
,row[1]
中的值包含TextID
中记录的results2
。
我的问题:根据游标中的值在词典(或词典列表)中查找值的快速方法是什么?
更新 所以我设法让我的光标查找字典列表,但它非常慢(我猜是因为它在我的光标中的每个项目循环遍历整个列表)。
for row in cursor:
if not row[0] == None:
for a in results1:
if not a['TextID'] == None:
if row[0] in a['TextID']:
#row[2] = a['RecID']
print "\t",row[0], a['TextID'], a['RecID']
#cursor.updateRow(row)
基本上我的词典列表看起来像
results1 = [{'TextID': u'74409', 'RecID': 10203040},{'TextID': u'75392', 'RecID': 12131415}]
我的光标如下:
cursor = [[u'75392', u'168569', None, None],[u'75392', u'168570', None, None],[u'68780', u'168571', None, None],[u'75392', u'168575', None, None],[u'68777', u'168586', None, None],[u'74409', u'168618', None, None],[u'68346', u'168663', None, None],[u'72926', u'168815', None, None],[u'72928', u'168849', None, None],[u'65802', u'168856', None, None]]
答案 0 :(得分:1)
我不确定我是否完全理解你的问题,但看起来你只是想让python代码查找textID,对吧?以下将解决这个问题。 我希望这是你想要的(我完全无视你的arcpy,pyodbc等东西)。 它在这里运行大约0.3秒,所以它应该足够快。 随机导入
#The results class
class results:
def __init__(self, results):
#textIDDict is a generated dict to speed up the lookup
self.textIDDict={row["TextID"]: row["RecID"] for row in results}
self.results=results
def lookup(self, textID):
try:
return self.textIDDict[textID]
except KeyError:
return "---"
#Two functions to create the (random) data:
def randStr():
return str(int(random.random()*60000))
def genRes(n):
return results([{"TextID":randStr(), "RecID": int(random.random()*10000)} for i in range(n)])
#Test it:
results1=genRes(60000)
results2=genRes(15000)
cursor=[[randStr(), randStr()] for i in range(50000)]
for row in cursor:
row.append(results1.lookup(row[0]))
row.append(results2.lookup(row[0]))
print row
或者,如果那个完整的程序,那么显然你想要的东西太复杂了, 这样更好吗?
result1dict={row["TextID"]: row["RecID"] for row in results1}
result2dict={row["TextID"]: row["RecID"] for row in results2}
for row in cursor[:10]:
if row[0]!=None:
try:
row[2]=result1dict[row[0]]
except KeyError:
row[2]='---'
if row[1]!=None:
try:
row[3]=result2dict[row[1]]
except KeyError:
row[3]='---'
print row
if row[1]!=None:
row[3]=result1dict[row[0]]