Python查找字典列表中的值列表

时间:2016-03-30 03:45:38

标签: python loops dictionary

我有两个从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并从字典对中返回RecIDrow[0]中的值包含TextID中记录的results1row[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]]

1 个答案:

答案 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]]