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

时间:2015-03-06 14:21:18

标签: python sql-server dictionary pypyodbc

鉴于这个元组列表:

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,我将查询Tagalogkey的{​​{1}}值到我的数据库(sql server)中:

my_dict

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

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

2 个答案:

答案 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似乎更接近你想要实现的目标。