python - 在Python中合并部分元组

标签 python

我有数百个采用以下格式的元组(id1、id2、id3、[xydata])例如:

('a', 'b', 'c', [(1, 2),(2, 3),(3, 4)])
('a', 'b', 'c', [(1, 1),(2, 4),(3, 6)])
('a', 'b', 'd', [(1, 3),(2, 6),(3, 7)])
('a', 'b', 'd', [(1, 7),(2, 8),(3, 9)])

现在我想合并元组,以便以相同的三个值开头的元组按以下方式组合。我保证所有 xydata 中都有相同的 X 值:

('a', 'b', 'c', [(1, mean(2, 1)),(2, mean(3, 4)),(3, mean(4, 6))])
('a', 'b', 'd', [(1, mean(3, 7)),(2, mean(6, 8)),(3, mean(7, 9))])

当前的解决方案需要几个步骤来重新排序和分解数据,将元组存储在多层字典中,然后将它们组合并重建原始数据结构。有没有一种简洁且 Pythonic 的方法来做到这一点?

最佳答案

使用itertools.groupby , izip和一些列表理解:

from itertools import groupby, izip
from pprint import pprint

lis = [('a', 'b', 'c', [(1, 2), (2, 3), (3, 4)]), ('a', 'b', 'c', [(1, 1), (2, 4), (3, 6)]), ('a', 'b', 'd', [(1, 3), (2, 6), (3, 7)]), ('a', 'b', 'd', [(1, 7), (2, 8), (3, 9)])]

def solve(seq, X):
    for k, g in groupby(seq, key=lambda x:x[:3]):
        data = ((y[1] for y in x[3]) for x in g)
        yield  tuple(list(k) + [[(a, sum(b, 0.0)/len(b)) 
                                                for a, b in izip(X, izip(*data))]])

X = [a for a, _ in lis[0][3]]
pprint(list(solve(lis, X)))  

输出:

[('a', 'b', 'c', [(1, 1.5), (2, 3.5), (3, 5.0)]),
 ('a', 'b', 'd', [(1, 5.0), (2, 7.0), (3, 8.0)])]

关于python - 在Python中合并部分元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22229636/

相关文章:

对 pandas 数据框进行 Python 曲线拟合,然后将 coef 添加到新列

Python 函数返回 None 而不是值

python - 将 Sublime 3 的 Python Build 更改为使用 py 而不是 python 作为命令

python - Haystack Whoosh 拼写建议太贪婪

python - 抓取的网站数据未写入 CSV

python - 使用 REGEX 提取模式之间的文本

python - 仅将字符串的特定部分设为大写

python - python代码中明显非法的字符序列

python - 进行条件 django 查询的更好方法

python - 什么是 tensorflow.python.data.ops.dataset_ops._OptionsDataset?