Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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 3.x 平均具有相同标识符的元组列表的值_Python 3.x_List - Fatal编程技术网

Python 3.x 平均具有相同标识符的元组列表的值

Python 3.x 平均具有相同标识符的元组列表的值,python-3.x,list,Python 3.x,List,我有下面的元组列表。我调用元组标识符的前两个元素 对于mylist中具有相同标识符的行,我想取具有相同标识符的行中第三个和第四个元素的平均值,并创建一个newlist,如下所示 newlist = [('a', 'b', 5, 3), ('c', 'd', 6, 7), ('e', 'f', 0, 3)] 这是我的工作方案。但是,应该有一个更有效的解决方案。因为我在一个非常大的列表(160万行)中实现了这一点,所以我需要更好的东西 Temp = [(

我有下面的元组列表。我调用元组标识符的前两个元素

对于
mylist
中具有相同标识符的行,我想取具有相同标识符的行中第三个和第四个元素的平均值,并创建一个
newlist
,如下所示

newlist = [('a', 'b', 5, 3),
           ('c', 'd', 6, 7),
           ('e', 'f', 0, 3)]
这是我的工作方案。但是,应该有一个更有效的解决方案。因为我在一个非常大的列表(160万行)中实现了这一点,所以我需要更好的东西

Temp = [(i[0],i[1]) for i in mylist]
Temp2 = {i: [] for i in list(set(Temp))}
Temp3 = {i: [] for i in Temp2.keys()}
for i in Temp2.keys():
    for j in mylist:
        if i == (j[0],j[1]):
            Temp2[i].append(j[2])
            Temp3[i].append(j[3])
newlist = [(i[0],i[1],np.mean(Temp2[i]),np.mean(Temp3[i])) for i in Temp2.keys()]

我可以在列表中完成它

mylist = [('a', 'b', 1, 2),
          ('c', 'd', 5, 6),
          ('e', 'f', 0, 3),
          ('c', 'd', 7, 8),
          ('a', 'b', 9, 4)]

ids = [x[:2] for x in mylist]
newlist = [(*i, *[sum(x) / ids.count(i) for x in zip(*[x[2:] for x in mylist if x[:2] == i])]) for i in set(ids)]
print(newlist)


我可以在列表中完成它

mylist = [('a', 'b', 1, 2),
          ('c', 'd', 5, 6),
          ('e', 'f', 0, 3),
          ('c', 'd', 7, 8),
          ('a', 'b', 9, 4)]

ids = [x[:2] for x in mylist]
newlist = [(*i, *[sum(x) / ids.count(i) for x in zip(*[x[2:] for x in mylist if x[:2] == i])]) for i in set(ids)]
print(newlist)


性能问题的关键是不要在列表上循环多次。特别是如果它很大的话

下面将根据标识符对值进行分组,然后获得平均值并重新生成所需的输出


delimiter = "-" # choose something not in your identifier. 
grouped_data = {}
for (id1, id2, val1, val2) in mylist:
    identifier = (delimiter).join([id1, id2])
    try:
        grouped_data[identifier]["col3"].append(val1)
        grouped_data[identifier]["col4"].append(val2)
    except KeyError:
        grouped_data[identifier] = {}
        grouped_data[identifier]["col3"] = [val1]
        grouped_data[identifier]["col4"] = [val2]

output_list = []
for identifier, values in grouped_data.items():
    this_output = identifier.split(delimiter)
    this_output.append(sum(values["col3"]) / len(values["col3"]))
    this_output.append(sum(values["col4"]) / len(values["col4"]))
    output_list.append(this_output)

print(output_list)

这里我们只在mylist上循环一次。然后,我们在
分组的_数据上循环一次;但这是一个小得多的列表。

性能问题的关键是不要在列表上循环多次。特别是如果它很大的话

下面将根据标识符对值进行分组,然后获得平均值并重新生成所需的输出


delimiter = "-" # choose something not in your identifier. 
grouped_data = {}
for (id1, id2, val1, val2) in mylist:
    identifier = (delimiter).join([id1, id2])
    try:
        grouped_data[identifier]["col3"].append(val1)
        grouped_data[identifier]["col4"].append(val2)
    except KeyError:
        grouped_data[identifier] = {}
        grouped_data[identifier]["col3"] = [val1]
        grouped_data[identifier]["col4"] = [val2]

output_list = []
for identifier, values in grouped_data.items():
    this_output = identifier.split(delimiter)
    this_output.append(sum(values["col3"]) / len(values["col3"]))
    this_output.append(sum(values["col4"]) / len(values["col4"]))
    output_list.append(this_output)

print(output_list)


这里我们只在mylist上循环一次。然后,我们在
分组的_数据上循环一次;但这是一个小得多的列表。

您的“标识符”的顺序重要吗?(a,b,1,2)和(b,a,3,4)是分组还是单独处理?是的,是这样。他们将是分开的。事实上,在原始数据中,我有四个元素作为标识符。我想创建一个合理的示例。您可以使用
itertools.groupby()
做一些事情。您必须首先对其进行排序,并提供
key=lambda x:(x[0],x[1])
@MartinC.Martin,如果可能,您能回答吗?您的“标识符”的顺序重要吗?(a,b,1,2)和(b,a,3,4)是分组还是单独处理?是的,是这样。他们将是分开的。事实上,在原始数据中,我有四个元素作为标识符。我想创建一个合理的示例。您可以使用
itertools.groupby()
做一些事情。您必须首先对其进行排序,并提供
key=lambda x:(x[0],x[1])
@MartinC.Martin,如果可能,您能回答吗?谢谢您的回答!我现在正在测试它。但是,我认为应该存在一个更具python风格的解决方案。您认为用
numpy.mean(x)
替换
sum(x)/ids.count(I)
会使任何事情都变得更快吗?不一定,但它会消除很大的依赖性。如果您需要它,并且认为
.mean
更易于阅读,那么它是一个很好的方法。主要的性能问题是多次循环
mylist
;这是一个非常大的列表(正如你所说),谢谢你的回答!我现在正在测试它。但是,我认为应该存在一个更具python风格的解决方案。您认为用
numpy.mean(x)
替换
sum(x)/ids.count(I)
会使任何事情都变得更快吗?不一定,但它会消除很大的依赖性。如果您需要它,并且认为
.mean
更易于阅读,那么它是一个很好的方法。主要的性能问题是多次循环
mylist
;这是一个非常大的列表(正如你所说),我实现了这一点,并且像快速的冈萨雷斯一样奔跑!我认为循环是不可避免的。嗯,确实如此,但不是我们当时的做法。谢谢!杰出的如果您可以添加依赖项,那么熊猫数据框架可能会比这种基于字典的方法提供更好的结果。但是添加熊猫是一个很好的假设。我实现了这一点,像快速的冈萨雷斯一样奔跑!我认为循环是不可避免的。嗯,确实如此,但不是我们当时的做法。谢谢!杰出的如果您可以添加依赖项,那么熊猫数据框架可能会比这种基于字典的方法提供更好的结果。但是,在这样一个答案中,添加熊猫是一个相当大的假设。