在Python字典中为单个键添加多个值

时间:2014-02-26 22:07:08

标签: python

Python词典今天真的有我。我一直在倾倒堆栈,试图找到一种方法来对python字典中的现有密钥进行简单的新值附加,并且我在每次尝试时都失败并使用我在此处看到的相同语法。

这就是我想要做的事情:

#cursor seach a xls file
definitionQuery_Dict = {}

for row in arcpy.SearchCursor(xls):

    # set some source paths from strings in the xls file
    dataSourcePath = str(row.getValue("workspace_path")) + "\\" + str(row.getValue("dataSource"))
    dataSource = row.getValue("dataSource")

    # add items to dictionary. The keys are the dayasource table and the values will be definition (SQL) queries. First test is to see if a defintion query exists in the row and if it does, we want to add the key,value pair to a dictionary.
    if row.getValue("Definition_Query") <> None:

        # if key already exists, then append a new value to the value list
        if row.getValue("dataSource") in definitionQuery_Dict:
            definitionQuery_Dict[row.getValue("dataSource")].append(row.getValue("Definition_Query"))
        else:
            # otherwise, add a new key, value pair
            definitionQuery_Dict[row.getValue("dataSource")] = row.getValue("Definition_Query")

我收到属性错误:

  

AttributeError:'unicode'对象没有属性'append'

但我相信我的答案与here

提供的答案相同

我已经尝试了各种其他方法,但没有其他各种错误消息。我知道这可能很简单,也许我在网上找不到正确的来源,但我被困住了。有人在乎帮忙吗?

谢谢, 麦克

3 个答案:

答案 0 :(得分:3)

问题在于您最初将值设置为字符串(即row.getValue的结果),但如果已存在则尝试附加它。您需要将原始值设置为包含单个字符串的列表。将最后一行更改为:

definitionQuery_Dict[row.getValue("dataSource")] = [row.getValue("Definition_Query")]

(注意括号围绕该值)。

ndpu使用defaultdict有一个好处:但如果你正在使用它,你应该总是append - 即将整个if / else语句替换为你当前正在做的追加如果条款。

答案 1 :(得分:3)

您的词典包含键和值。如果要随意添加值,则每个值必须是可以扩展/扩展的类型,如列表或其他字典。目前,字典中的每个值都是一个字符串,而您想要的是一个包含字符串的列表。如果您使用列表,则可以执行以下操作:

mydict = {}
records = [('a', 2), ('b', 3), ('a', 4)]

for key, data in records:
    # If this is a new key, create a list to store
    # the values
    if not key in mydict:
        mydict[key] = []
    mydict[key].append(data)

输出:

mydict
Out[4]: {'a': [2, 4], 'b': [3]}

请注意,即使'b'只有一个值,该单个值仍然必须放在一个列表中,以便稍后可以添加。

答案 2 :(得分:2)

使用collections.defaultdict

from collections import defaultdict

definitionQuery_Dict = defaultdict(list)
# ...