在创建具有许多列的 CSV 文件时,经常会遇到这样的代码结构:
try:
printlist.append(text['data'])
except:
printlist.append('')
这段代码是为了检查字典 text
中是否存在键 'data'
,如果存在,则将它的值添加到 printlist
列表中,否则添加一个空字符串。这样的代码结构会重复出现很多次,使得代码难以阅读和维护。
2、解决方案
方法一:使用字典的 get()
方法
Python 字典有一个内置的方法 get()
,它允许你指定一个默认值,如果字典中不存在某个键,则返回该默认值。我们可以使用这个方法来简化上述代码:
printlist.append(text.get('data', default=''))
这样,如果 text
字典中不存在键 'data'
,则 get()
方法会返回默认值 ''
,并将其添加到 printlist
列表中。
方法二:自定义函数
也可以创建一个自定义函数来简化代码:
def tryexcept(input):
return input.get('data', default='')
然后,就可以使用这个函数来代替 try/except
块:
printlist.append(tryexcept(text))
方法三:使用迭代器
如果需要处理嵌套字典,可以使用迭代器来遍历字典,并使用 get()
方法来获取值。例如,以下代码演示了如何使用迭代器来获取嵌套字典中的值:
class TokenDataType:
LIST = "list"
DICT = "dict"
def _select_key(keyitt, data):
try:
new_key = keyitt.next()
except StopIteration:
return data
if new_key["t"] == TokenDataType.DICT:
return _select_key(keyitt, data[new_key["k"]])
elif new_key["t"] == TokenDataType.LIST:
return _select_key(keyitt, data[new_key["i"]])
def tokenize_query(query):
tokens = []
for token in query.split("."):
token = token.strip()
if token:
ttype = TokenDataType.LIST if "[" in token else TokenDataType.DICT
if ttype == TokenDataType.LIST:
index = None
if len(token) >= 3:
index = int(token.replace("[", "").replace("]", ""))
tokens.append({"k":token, "t":ttype, "i":index})
else:
tokens.append({"k":token, "t":ttype})
return tokens
def normalize_query(query=None, tokens=None):
if tokens == None:
tokens = tokenize_query(query)
return ".".join([token["k"] for token in tokens])
def select(query, data, throw_exception_on_key_not_found=False):
tokens = tokenize_query(query)
try:
return _select_key(iter(tokens), data)
except Exception as e:
if throw_exception_on_key_not_found:
raise e
return None
DQ = select
if __name__ == "__main__":
test = {"bla":1, "foo":{"bar":2}, "baz":[{"x":1}, {"x":2}]}
print(DQ(".bla", test))
print(DQ("bla", test))
print(DQ("nothere", test))
print(DQ(".foo", test))
print(DQ("foo.bar", test))
print(DQ("baz", test))
print(DQ("baz.[0]", test))
print(DQ("baz.[1].x", test))
print(DQ("baz.[2].x", test))
for your case (appends None when one of the keys is not found):
printlist.append(DQ("data.someotherkey.yetanotherkey", text))
这种方法可以处理任意嵌套的字典,并返回字典中指定键的值,或者返回默认值。