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
提供的答案相同我已经尝试了各种其他方法,但没有其他各种错误消息。我知道这可能很简单,也许我在网上找不到正确的来源,但我被困住了。有人在乎帮忙吗?
谢谢, 麦克
答案 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)
from collections import defaultdict
definitionQuery_Dict = defaultdict(list)
# ...