我经常发现自己通过逐行读取文件来填充列表和词组。
假设我正在阅读一系列人物和他们最喜欢的食物:
ANNE CHEESE
ANNE POTATO
JOE PEAS
JOE CHIPS
JOE FISH
BERNARD LENTILS
到Python词典:
{
"ANNE" : ["CHEESE", "POTATO"],
"JOE" : ["PEAS", "CHIPS", "FISH"],
"BERNARD": ["LENTILS"]
}
我使用的一般模式是逐行读取文件,在每种情况下,在尝试追加之前检查密钥是否已经存在。今天我决定概括一下并编写一个safe_append
函数,它会在附加到列表或设置字典键之前创建相关对象:
def safe_append(list_object, list_key, list_value, value_dict_key= None):
# Add empty dict if it does not already exist
if list_key not in list_object:
if value_dict_key is not None:
list_object[list_key] = {}
else:
list_object[list_key] = []
# Append/set value
if value_dict_key is not None:
list_object[list_key][value_dict_key] = list_value
else:
list_object[list_key].append(list_value)
# Return object (for chaining)
return list_object
# Usage: dict in dict
x = {}
safe_append(x, "a","b",value_dict_key = "c")
>>> {"a":{"c":"b"}}
# Usage: list in dict
x = []
safe_append(x, "a","b")
>>> {"a":["b"]}
这看起来相当笨拙和丑陋。我的问题:有没有更好/更pythonic的方法来做到这一点?
答案 0 :(得分:8)
更好的方法是使用defaultdict:
>>> from collections import defaultdict
>>> d = defaultdict(list)
>>> d["hello"].append(1)
>>> d["hello"].append(2)
>>> dict(d)
{'hello':[1, 2]}
答案 1 :(得分:2)
如果您的所有值都是列表,则可以使用defaultdict。否则,您可以通过链接setdefault并附加:
来获得类似的行为a = {}
for key,value in [("k1","v1"), ("k1","v2")]:
a.setdefault(key,[]).append(value)