我有一份清单清单:
[['a', 1],['b', 2]['c', 3]['c', 1]['c', 9]['d', 8]['d', 4]]
我想用:
制作一本字典{ a:1, b:2, c:[3,1,9],d:[8,9]}
我尝试了以下内容:
count = 0
sw_fd_dict = {}
value_list =[]
sw_fd_list2 = [['a', 1],['b', 2],['c', 3],['c', 1],['c', 9],['d', 8],['d', 4]]
while count < len(sw_fd_list2):
try:
# to check for repeated keys like "c"
if sw_fd_list2[count][0] != sw_fd_list2[count-1][0]:
sw_fd_dict[sw_fd_list2[count][0]] = sw_fd_list2[count][1]
elif sw_fd_list2[count][0] == sw_fd_list2[count-1][0]:
value_list.append(sw_fd_list2[count-1][1])
value_list.append(sw_fd_list2[count][1])
sw_fd_list2[count][1] =value_list
sw_fd_dict[sw_fd_list2[count][0]] = sw_fd_list2[count][1]
except Exception as e:
print str(e)
count += 1
print sw_fd_dict
有更好的方法吗?
答案 0 :(得分:3)
这是一种较短的方法:
result = {}
for (key, value) in the_list:
result.setdefault(key, []).append(value)
setdefault
会返回该值(例如get
),但如果它不存在则先设置它。 (defaultdict
在这里也可以正常工作。)
在重新阅读问题时,如果你真的希望不的单个数字是列表,你可以放入更多的条件。我对此进行了编辑以使用set
,而不是检查现有值是否可附加,以便“安全”。如果您的值是集合而不是数字。
result = {}
seen = set()
for (key, value) in the_list:
if key not in result:
result[key] = value
elif key not in seen:
result[key] = [result[key], value]
seen.add(key)
else:
result[key].append(value)
或者,将defaultdict风格的答案转换为不在列表中的单个数字的答案的好方法:
result = {
key: value[0] if len(value) == 1 else value
for key, value in result.items()}
答案 1 :(得分:2)
您可以在collections
包中使用defaultdict
:
from collections import defaultdict
sw_fd_dict = defaultdict(list)
sw_fd_list2 = [['a', 1],['b', 2], ['c', 3], ['c', 1], ['c', 9], ['d', 8], ['d', 4]]
for key, val in sw_fd_list2:
sw_fd_dict[key].append(val)
sw_fd_dict
Out[8]: defaultdict(<type 'list'>, {'a': [1], 'c': [3, 1, 9], 'b': [2], 'd': [8, 4]})
然后将其转换为传统的dict
:
dict(sw_fd_dict)
Out[9]: {'a': [1], 'b': [2], 'c': [3, 1, 9], 'd': [8, 4]}
编辑: Quentin THEURET指出我没有复制你想要的确切结果。感谢他的评论,我注意到你需要将单个值作为一个整数,而不是包含在列表中。然后,您可以执行一些后处理:
d = dict(sw_fd_dict)
for k in d.keys():
if len(d[k]) == 1:
d[k] = d[k][0]
d
Out[15]: {'a': 1, 'b': 2, 'c': [3, 1, 9], 'd': [8, 4]}
答案 2 :(得分:1)
def list_to_dict(l):
d = {}
for key, val in l:
if key in d:
if isinstance(d[key], list):
d[key].append(val)
else:
d[key] = [d[key], val]
else:
d[key] = val
return d
sw_fd_list2 = [['a', 1],['b', 2],['c', 3],['c', 1],['c', 9],['d', 8],['d', 4]]
res = list_to_dict(sw_fd_list2)
答案 3 :(得分:0)
非常相似的问题:https://stackoverflow.com/a/960753/1317856
>>> l = [['a', 1],['b', 2]['c', 3]['c', 1]['c', 9]['d', 8]['d', 4]]
>>> from collections import defaultdict
>>> d = defaultdict(list)
>>> for a, b in l:
d[a].append(b)
>>> dict(d)
{'a': [1], 'c': [3, 1, 9], 'b': [2], 'd': [8, 4]}