1

鉴于此元组列表:

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,我将在我的数据库(sql server)中查询 in 的Tagalog值:keymy_dict

myDatabase
+---------+---------+
| English | Tagalog |
+---------+---------+
| cat     | pusa    |
| soup    | sopas   |
| the     | ang     |
| drink   | inom    |
+---------+---------+

并将输出显示为这样的字符串:

ang pusa inom ang sopas
4

2 回答 2

0

字典是唯一键到值的映射。注意那里的独特之处;它们包含键值映射,但键只有一个副本。

这个限制赋予了字典实现它的权力;您可以在恒定时间内查找任何键的值。无论您将多少(唯一)键放入字典中,您都可以预期,在常见情况下,查找任何键不会比在小字典中花费更多时间。

为了管理这一壮举,字典不关心键的顺序;该实现会将它们按(内部)排列,这对字典来说比对您更方便。请参阅为什么 Python 字典和集合中的顺序是任意的?

这一切只是意味着你误解了字典的用途。您只想提取列表的第一个元素,以便将它们传递给查询:

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>)查询来限制应该查找哪些他加禄语单词。要使用查询参数,您需要首先生成一个?占位符列表。

INSQL 成员资格测试将元素视为一个集合(仅再次唯一值),因此您不妨在此处创建一个queryparams集合并避免将重复的单词发送到数据库:

queryparams = Iist({l[0] for l in lists})

该集合被转回列表,因为我不知道 pypyodbc 是否接受集合作为查询参数值输入。

如果您需要使用输入顺序将英语映射到他加禄语,请将数据库结果用作字典:

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 以这种方式保留原始输入列表的顺序,因此最终查询结果会以相同的顺序为您提供他加禄语单词。

于 2015-03-07T08:43:19.123 回答
-1

python中的字典没有设计顺序,也没有重复的键,所以你不能从字典中得到你期望的东西。有关详细信息,请参阅字典的文档。

collections.defaultdict这似乎更接近您想要实现的目标。

于 2015-03-06T14:23:37.263 回答