Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python字典理解中向单个键添加多个值_Python_Dictionary - Fatal编程技术网

在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}