Python creating a dictionary of lists
我想创建一个值为列表的字典。例如:
1 2 3 4 5 | { 1: ['1'], 2: ['1','2'], 3: ['2'] } |
如果我这样做:
1 2 3 4 5 | d = dict() a = ['1', '2'] for i in a: for j in range(int(i), int(i) + 2): d[j].append(i) |
我得到一个键错误,因为d[…]不是一个列表。在这种情况下,我可以在分配后添加以下代码来初始化字典。
1 2 | for x in range(1, 4): d[x] = list() |
有更好的方法吗?假设在进入第二个
1 2 3 4 5 6 7 | class relation: scope_list = list() ... d = dict() for relation in relation_list: for scope_item in relation.scope_list: d[scope_item].append(relation) |
一个替代方案将取代
1 | d[scope_item].append(relation) |
具有
1 2 3 4 | if d.has_key(scope_item): d[scope_item].append(relation) else: d[scope_item] = [relation,] |
最好的方法是什么?理想情况下,附加将"只起作用"。有没有什么方法可以表达我想要一个空列表的字典,即使我在第一次创建列表时不知道每个键?
您可以使用defaultdict:
1 2 3 4 5 6 7 8 9 10 | >>> from collections import defaultdict >>> d = defaultdict(list) >>> for i in a: ... for j in range(int(i), int(i) + 2): ... d[j].append(i) ... >>> d defaultdict(<type 'list'>, {1: ['1'], 2: ['1', '2'], 3: ['2']}) >>> d.items() [(1, ['1']), (2, ['1', '2']), (3, ['2'])] |
你可以用这样的列表理解来构建它:
1 2 | >>> dict((i, range(int(i), int(i) + 2)) for i in ['1', '2']) {'1': [1, 2], '2': [2, 3]} |
在问题的第二部分,使用defaultdict
1 2 3 4 5 6 7 8 | >>> from collections import defaultdict >>> s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)] >>> d = defaultdict(list) >>> for k, v in s: d[k].append(v) >>> d.items() [('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])] |
使用
1 2 3 4 5 6 7 | d = dict() a = ['1', '2'] for i in a: for j in range(int(i), int(i) + 2): d.setdefault(j, []).append(i) print d # prints {1: ['1'], 2: ['1', '2'], 3: ['2']} |
这个名字很奇怪的
编辑:正如其他人正确指出的那样,
您的问题已经得到回答,但是IIRC可以替换如下行:
1 | if d.has_key(scope_item): |
用:
1 | if scope_item in d: |
也就是说,
简单的方法是:
1 2 3 4 5 6 7 | a = [1,2] d = {} for i in a: d[i]=[i, ] print(d) {'1': [1, ], '2':[2, ]} |
就我个人而言,我只是使用JSON将事物转换为字符串并返回。我能理解琴弦。
1 2 3 4 5 6 7 | import json s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)] mydict = {} hash = json.dumps(s) mydict[hash] ="whatever" print mydict #{'[["yellow", 1], ["blue", 2], ["yellow", 3], ["blue", 4], ["red", 1]]': 'whatever'} |