通过遍历python列表,我想创建一个列表词典,每个词典的值也是一个列表。
结构将是:
[{key1: [val1, val2]}, {key2: [val3, val4]}, {key3: [val5, val6]}, ...]
我从一个整数列表开始:
my_list = [3423, 77813, 12, 153, 1899]
对于列表中的每个元素,这应该成为字典键。然后我将两个项附加到字典的值(这是一个列表)。 (让我们说这两个项目总是"狗"和" cat")
以下是最终结果:
[{3423:['dog', 'cat']}, {77813:['dog', 'cat']}, {12:['dog', 'cat']},
{153:['dog', 'cat']}, {1899:['dog', 'cat']}]
我尝试这样做有很多问题:
for i in my_list:
d = {} ## create a dictionary 'd'
d[i] = [].append('dog') ## or `d[i] = ['dog'].append('cat')`
my_list.append(d) ## here is a bug
my_list.remove(i) ## remove the item from the list
我不喜欢我必须命名一个空字典,并让它们各自命名相同的东西(这里,d
)。之后,我想通过钥匙访问这些词典 - 我不在乎他们的名字。
我不知道如何将多个项目明确地附加到字典值上,而它实际上应该是一个列表。如果我想添加几个项目怎么办?
该错误将字典附加到原始列表,然后删除该项目。当然,这可以通过一个新列表来解决:
new_list = []
for i in my_list:
d = {}
d[i] = [].append('dog')
new_list.append(d)
my_list.remove(i)
但这感觉非常笨拙。
答案 0 :(得分:6)
如果你想要一些非常简单的东西,你可以使用列表理解:
data = ['dog', 'cat']
my_list = [3423, 77813, 12, 153, 1899]
result = [{k:data} for k in my_list]
print(result)
# [{3423: ['dog', 'cat']}, {77813: ['dog', 'cat']}, {12: ['dog', 'cat']}, {153: ['dog', 'cat']}, {1899: ['dog', 'cat']}]
此外,以下是使用非常方便的defaultdict
添加/删除值的示例:
from collections import defaultdict
my_list = [3423, 77813, 12, 153, 1899]
new_list = []
for number in my_list:
# create the defaultdict here
d = defaultdict(list)
# add some data
d[number] += ['dog', 'cat', 'kitten']
# remove some data
d[number].remove('kitten')
# append dictionary
new_list.append(dict(d))
print(new_list)
哪个输出:
[{3423: ['dog', 'cat']}, {77813: ['dog', 'cat']}, {12: ['dog', 'cat']}, {153: ['dog', 'cat']}, {1899: ['dog', 'cat']}]
在这里使用defaultdict
很有帮助,因为它使用空列表初始化字典中的每个条目。如果您不想这样做,您可以使用普通词典实现此目的,如问题所示,但这需要您自己初始化空列表。
答案 1 :(得分:2)
您可以使用collections.defaultdict
字典子类使处理变得非常简单:
from collections import defaultdict
from pprint import pprint
my_list = [3423, 77813, 12, 153, 1899]
d = defaultdict(list)
for i in my_list:
d[i].append('dog')
d[i].append('cat')
d = dict(d) # Convert d into a regular dictionary (optional).
pprint(d)
输出:
{12: ['dog', 'cat'],
153: ['dog', 'cat'],
1899: ['dog', 'cat'],
3423: ['dog', 'cat'],
77813: ['dog', 'cat']}
当然,如果您要做的就是将这两个项目附加到每个条目,那么在单个操作中执行这两项操作会稍微有点效率,如下所示:
for i in my_list:
d[i].extend(['dog', 'cat'])
答案 2 :(得分:2)
如果要对每个键使用不同值的列表推导。
keys = ['key1', 'key2', 'key3']
values = [['val11', 'val12'], ['val21', 'val22'], ['val31', 'val32']]
# This is what you want (if I understood correctly)
dlist = [{x:values[i]} for i,x in enumerate(keys)]
print(dlist)
# When you want to add more dictionary to the list
dlist.append({'key4': ['val41', 'val42']})
print(dlist)
输出:
[{'key1':['val11','val12']}, {'key2':['val21','val22']}, {'key3':['val31','val32']}]
[{'key1':['val11','val12']}, {'key2':['val21','val22']}, {'key3':['val31','val32']}, {'key4':['val41', 'val42']}]
答案 3 :(得分:2)
你不需要删除,不需要导入任何外部模块或不使它太复杂你可以在纯python中简单地遵循这个模式:
data = ['dog', 'cat']
my_list = [3423, 77813, 12, 153, 1899]
new_data={}
for item in my_list:
for sub_item in data:
if item not in new_data:
new_data[item]=[sub_item]
else:
new_data[item].append(sub_item)
print(new_data)
输出:
{153: ['dog', 'cat'], 1899: ['dog', 'cat'], 12: ['dog', 'cat'], 77813: ['dog', 'cat'], 3423: ['dog', 'cat']}