鉴于这个元组列表:
lists = [('the', 'DT'), ('cat', 'NN'), ('drink', 'NN'), ('the', 'DT'), ('soup', 'NN')]
其中,
DT NN NN DT NN
是每个单词的词性标记,我将lists
转换为字典:
my_dict = dict(lists)
它给了我这个输出:
{'soup': 'NN', 'the': 'DT', 'drink': 'NN', 'cat': 'NN'}
因为我注意到只有一个'the': 'DT'
并且订单也被更改了。我的期望是转换后的lists
将是这样的:
{'the': 'DT','cat': 'NN','drink': 'NN','the': 'DT','soup': 'NN'}
然后使用pypyodbc,我将查询Tagalog
中key
的{{1}}值到我的数据库(sql server)中:
my_dict
并将输出显示为字符串,如下所示:
myDatabase
+---------+---------+
| English | Tagalog |
+---------+---------+
| cat | pusa |
| soup | sopas |
| the | ang |
| drink | inom |
+---------+---------+
答案 0 :(得分:0)
词典是 唯一键到值的映射。注意那里的唯一;它们包含键值映射,但只有一个键的副本。
这种限制使词典实现了它的力量;您可以在常量时间中查找任何键的值。无论您将多少(唯一)键放入字典中,您都可以预期,在常见情况下,查找任何键所需的时间不会比在小字典中查找更多。
要管理此专长,词典不关心键的顺序;实现将把它们放在一个(内部)的顺序,这对于字典比对你来说更方便。见Why is the order in Python dictionaries and sets arbitrary?
这一切只是意味着你误解了词典的用途。您只想提取列表的第一个元素,以便将它们传递给查询:
queryparams = [l[0] for l in lists]
然后使用参数将这些用于pypyodbc SQL查询:
query = 'SELECT tagalog FROM myDatabase WHERE english in ({})'.format(
', '.join(['?'] * len(queryparams)))
cursor.execute(query, queryparams)
for row in cursor:
print('Tagalog:', row[0])
我在这里使用WHERE <column> IN (<value1>, <value2>, .., <valueN>)
查询来限制应该查找的塔加拉族语单词。要使用查询参数工作,您需要先生成?
占位符列表。
IN
SQL成员资格测试将元素视为一个集合(仅再次使用唯一值),因此您也可以在此处设置queryparams
,并避免向数据库发送重复的字词:
queryparams = Iist({l[0] for l in lists})
该集合被转回列表,因为我不知道pypyodbc是否接受集合作为查询参数值输入。
如果您需要使用输入订单将英语映射到Tagalog,请将数据库结果用作字典:
query = 'SELECT english, tagalog FROM myDatabase WHERE english in ({})'.format(
', '.join(['?'] * len(queryparams)))
cursor.execute(query, queryparams)
english_to_tagalog = dict(cursor) # use each (english, tagalog) pair as a mapping
output = [english_to_tagalog[l[0]] for l in lists]
如果您的单词列表变得很长,您可能必须切换到使用临时表,在那里插入所有单词(所有单词,而不仅仅是唯一单词)并使用内部联接查询来使SQL Server翻译给你的话。您可以让SQL Server保留原始输入列表的顺序,因此最终查询结果会以相同的顺序为您提供Tagalog单词。
答案 1 :(得分:-1)
python中的一个字典没有按设计的顺序,也没有重复的键,所以你无法得到你对dict的期望。有关详细信息,请参阅dictonnaries'doc。
collections.defaultdict
似乎更接近你想要实现的目标。