使用列表理解构建一个以列表作为值的字典
Building a dictionary with lists as values using list comprehension
我正在尝试使用 list/dict 理解 来简化以下代码,其中我想从列表中构建列表字典。
在这个例子中,我将每个项目的mod(或任何其他函数)作为键。如果字典中不存在该键,则创建一个新列表并将该项目追加到列表中,否则直接追加该项目。
def get_key(val):
return val % 3 # Can be something else, it doesn't matter
dict = {}
data = [i for i in range(10)]
for item in data:
key = get_key(item)
if key in dict:
dict[key].append(item)
else:
dict[key] = [item]
print(dict)
预期输出
{0: [0, 3, 6, 9], 1: [1, 4, 7], 2: [2, 5, 8]}
为了简化上面的代码,我试过这种丑陋的方法:
for item in data:
key = get_key(item)
dict[key] = [item] if key not in dict else (dict[key], dict[key].append(item))[0]
然而,如何在没有 for 循环的情况下实现同样的事情,将 list/dict 推导式用作单个表达式?
我能想到这样的事情,但它无法将值附加到预先存在的列表中。
{get_key(item):[item] for item in data}
相关帖子:
- Create a dictionary with list comprehension
- if/else in a list comprehension(注意:我在想也许条件表达式可能会起作用,但不确定如何将它与表达式结合起来)
你真的不需要 list/dict 理解。只需使用带有 defaultdict
:
的普通循环
out = collections.defaultdict(list)
for i in range(10):
out[i % 3].append(i)
你很接近。下面是我使用字典理解的方法
data = list(range(0,10))
mod= 3
{i:data[i::mod] for i in range(mod)}
出
{0: [0, 3, 6, 9], 1: [1, 4, 7], 2: [2, 5, 8]}
尝试default dict,
from collections import defaultdict
d = defaultdict(list)
for item in range(10):
d[item % 3].append(item)
创建值列表的列表,每个子列表的第一个元素是键 [n] +
,然后使用它来创建字典。
m = [[n] + [i[1] for i in [(x%3,x) for x in range(10)]if i[0] == n] for n in range(3)]
dictt = {i[0]:i[1:] for i in m}
print(dictt)
>>> {0: [0, 3, 6, 9], 1: [1, 4, 7], 2: [2, 5, 8]}
全部在一条线上
dictt = {i[0]:i[1:] for i in [[n] + [i[1] for i in [(x%3,x) for x in range(10)]if i[0] == n] for n in range(3)]}
我正在尝试使用 list/dict 理解 来简化以下代码,其中我想从列表中构建列表字典。
在这个例子中,我将每个项目的mod(或任何其他函数)作为键。如果字典中不存在该键,则创建一个新列表并将该项目追加到列表中,否则直接追加该项目。
def get_key(val):
return val % 3 # Can be something else, it doesn't matter
dict = {}
data = [i for i in range(10)]
for item in data:
key = get_key(item)
if key in dict:
dict[key].append(item)
else:
dict[key] = [item]
print(dict)
预期输出
{0: [0, 3, 6, 9], 1: [1, 4, 7], 2: [2, 5, 8]}
为了简化上面的代码,我试过这种丑陋的方法:
for item in data:
key = get_key(item)
dict[key] = [item] if key not in dict else (dict[key], dict[key].append(item))[0]
然而,如何在没有 for 循环的情况下实现同样的事情,将 list/dict 推导式用作单个表达式?
我能想到这样的事情,但它无法将值附加到预先存在的列表中。
{get_key(item):[item] for item in data}
相关帖子:
- Create a dictionary with list comprehension
- if/else in a list comprehension(注意:我在想也许条件表达式可能会起作用,但不确定如何将它与表达式结合起来)
你真的不需要 list/dict 理解。只需使用带有 defaultdict
:
out = collections.defaultdict(list)
for i in range(10):
out[i % 3].append(i)
你很接近。下面是我使用字典理解的方法
data = list(range(0,10))
mod= 3
{i:data[i::mod] for i in range(mod)}
出
{0: [0, 3, 6, 9], 1: [1, 4, 7], 2: [2, 5, 8]}
尝试default dict,
from collections import defaultdict
d = defaultdict(list)
for item in range(10):
d[item % 3].append(item)
创建值列表的列表,每个子列表的第一个元素是键 [n] +
,然后使用它来创建字典。
m = [[n] + [i[1] for i in [(x%3,x) for x in range(10)]if i[0] == n] for n in range(3)]
dictt = {i[0]:i[1:] for i in m}
print(dictt)
>>> {0: [0, 3, 6, 9], 1: [1, 4, 7], 2: [2, 5, 8]}
全部在一条线上
dictt = {i[0]:i[1:] for i in [[n] + [i[1] for i in [(x%3,x) for x in range(10)]if i[0] == n] for n in range(3)]}