python 中的字典是否允许重复?

Does dictionary in python allow duplication?

鉴于此元组列表:

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,我将查询 my_dictkeyTagalog 值到我的数据库(sql 服务器):

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

并将输出显示为字符串,如下所示:

ang pusa inom ang sopas

python 中的字典没有顺序设计,它也没有重复的键,因此您无法从字典中得到您期望的内容。有关详细信息,请参阅 dictonnaries'doc

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

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

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

为了做到这一点,字典不关心键的排列顺序;该实现会将它们按(内部)顺序排列,这对字典来说比对您来说更方便。参见 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>) 查询来限制应该查找的他加禄语单词。要使其与查询参数一起使用,您需要先生成一个 ? 占位符列表。

A IN SQL 成员资格测试将元素视为一个集合(又是唯一值),因此您不妨在此处将 queryparams 设为一个集合,避免将重复的单词发送到数据库:

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

因为不知道pypyodbc是否接受sets作为查询参数值输入,set变回了list。

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

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]

如果您的单词列表变得很长,您可能必须切换到使用临时 table,将所有单词插入其中(所有单词,而不仅仅是独特的单词)并使用内部连接查询让 SQL 服务器为您翻译单词。您也可以让 SQL 服务器以这种方式保留原始输入列表的顺序,因此最终查询结果会以相同的顺序为您提供他加禄语单词。