在Python字典理解中向单个键添加多个值
我想学习如何使用字典理解,并决定在之前解决的任务中使用字典理解。我需要为同一个键分配多个值。我想知道是否有更好的方法来实现我正在尝试做的事情,而不是使用我目前编写的代码在Python字典理解中向单个键添加多个值,python,dictionary,Python,Dictionary,我想学习如何使用字典理解,并决定在之前解决的任务中使用字典理解。我需要为同一个键分配多个值。我想知道是否有更好的方法来实现我正在尝试做的事情,而不是使用我目前编写的代码 graph = {(x1,y1): [(c,d) for a,b,c,d in data if a == x1 and b == y1] for x1 ,y1, x2, y2 in data} 例如,我有: data = {(1,2,1,5),(1,2,7,2),(1,5,4,7),(4,7,7,5)} 前两个值应创建一个键
graph = {(x1,y1): [(c,d) for a,b,c,d in data if a == x1 and b == y1] for x1 ,y1, x2, y2 in data}
例如,我有:
data = {(1,2,1,5),(1,2,7,2),(1,5,4,7),(4,7,7,5)}
前两个值应创建一个键,其余两个值应作为键的值添加。
对于给定的示例,我想返回:
{(1, 2): [(1, 5), (7, 2)], (1, 5): [(4, 7)], (4, 7): [(7, 5)]}
有没有比遍历整个数据以查找匹配值更简单的方法?您的代码很简洁,但时间复杂度为^2,可以降低为On
data = {(1,2,1,5),(1,2,7,2),(1,5,4,7),(4,7,7,5)}
result = dict()
for item in data:
key = (item[0],item[1])
value = result.setdefault(key,[])
value.append((item[2],item[3]))
result[key] = value
print result
在我看来,使用for循环可以使代码更全面我不知道这是否是最好的答案,但我会这样做:
m_dict = {}
for val in data:
key = (val[0],val[1])
if key in m_dict:
m_dict[key].append((val[2],val[3]))
else:
m_dict[key] = [(val[2],val[3])]
或者更简洁地使用setdefault:
实际上,你的听写理解并不是一个有效的方法。它不必要地在同一数据集上包含一个for循环,而是两个for循环 在这里只使用一个简单的for循环更像python:
from collections import defaultdict
data = {(1,2,1,5),(1,2,7,2),(1,5,4,7),(4,7,7,5)}
output = defaultdict(list)
for a, b, c, d in data:
output[a, b].append((c, d))
在这种情况下,我将使用。例如:
dict(groupby(data, lambda t: (t[0], t[1])))
这将生成一个dict,其中键等于1、2、1、5和4、7,值由1、2、1、5、1、2、7、2。。。对于大多数用途来说,这应该足够了。如果需要,还可以对分组列表进行后期处理
如下面的评论所述,groupby需要排序数据。因此,您需要在分组之前进行排序,并且可能希望将迭代器强制转换为列表:
first_two = lambda tup: (tup[0], tup[1])
groups = groupby(sorted(data, key=first_two), first_two)
target = {k: list(g) for k, g in groups}
相反,您可以使用字典的setdefault方法来完成所有这些操作。这可以更加简化删除for循环和写入结果中的所有内容。setdefaultitem[0],item[1],]。appenditem[2],item[3]groupby需要排序数据。输出返回迭代器{1,2:,不是列表这两个都是正确的。但是,它解决了问题。我将修改我的答案。这是我以前的答案:它比我在上面示例中的两个循环做得更好,谢谢你的答案!:
first_two = lambda tup: (tup[0], tup[1])
groups = groupby(sorted(data, key=first_two), first_two)
target = {k: list(g) for k, g in groups}