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
;这是一个非常大的列表(正如你所说),我实现了这一点,并且像快速的冈萨雷斯一样奔跑!我认为循环是不可避免的。嗯,确实如此,但不是我们当时的做法。谢谢!杰出的如果您可以添加依赖项,那么熊猫数据框架可能会比这种基于字典的方法提供更好的结果。但是添加熊猫是一个很好的假设。我实现了这一点,像快速的冈萨雷斯一样奔跑!我认为循环是不可避免的。嗯,确实如此,但不是我们当时的做法。谢谢!杰出的如果您可以添加依赖项,那么熊猫数据框架可能会比这种基于字典的方法提供更好的结果。但是,在这样一个答案中,添加熊猫是一个相当大的假设。