我正在用以下值模拟SQL查询:

rows = [(1, '2021/04', 'Shop 2', 341227.53), (2, '2021/05', 'Shop 2', 315447.24), (3, '2021/06', 'Shop 1', 1845662.35), (4, '2021/04', 'Shop 2', 21487.63), (5, '2021/05', 'Shop 1', 1489774.16), (6, '2021/06', 'Shop 1', 52489.35), (7, '2021/04', 'Shop 1', 154552.82), (8, '2021/05', 'Shop 2', 6548.49), (9, '2021/06', 'Shop 2', 387779.49)]

我想构建一个"窗口"功能的字典.它应该在第三列(ex Value:"shop 1")上分区,并按第二列(ex Value:"2021/06")排序.

所以,它应该看起来像这样:

{
    'Shop 1': ['2021/04', '2021/05', ...],
    'Shop 2': [...],
    ...
}

是否有一种方法可以做到这一点,以便我可以定义一个包含两个参数的Lambda函数,例如:

window_func = lambda partition_func, order_func: ...

上面的partition_func将是item[2],order_func将是item[3].

推荐答案

试着:

from itertools import groupby
from operator import itemgetter

rows = [
    (1, "2021/04", "Shop 2", 341227.53),
    (2, "2021/05", "Shop 2", 315447.24),
    (3, "2021/06", "Shop 1", 1845662.35),
    (4, "2021/04", "Shop 2", 21487.63),
    (5, "2021/05", "Shop 1", 1489774.16),
    (6, "2021/06", "Shop 1", 52489.35),
    (7, "2021/04", "Shop 1", 154552.82),
    (8, "2021/05", "Shop 2", 6548.49),
    (9, "2021/06", "Shop 2", 387779.49),
]

window_func = lambda partition_func, order_func: lambda x: {
    k: [order_func(v) for v in g]
    for k, g in groupby(
        sorted(x, key=lambda v: (partition_func(v), order_func(v))), partition_func
    )
}

fn = window_func(itemgetter(2), itemgetter(1))
print(fn(rows))

打印:

{
    "Shop 1": ["2021/04", "2021/05", "2021/06", "2021/06"],
    "Shop 2": ["2021/04", "2021/04", "2021/05", "2021/05", "2021/06"],
}

编辑:要获取输出中的行列表:

window_func = lambda partition_func, order_func: lambda x: {
    k: list(g)
    for k, g in groupby(
        sorted(x, key=lambda v: (partition_func(v), order_func(v))), partition_func
    )
}

fn = window_func(itemgetter(2), itemgetter(1))
print(fn(rows))

打印:

{
    "Shop 1": [
        (7, "2021/04", "Shop 1", 154552.82),
        (5, "2021/05", "Shop 1", 1489774.16),
        (3, "2021/06", "Shop 1", 1845662.35),
        (6, "2021/06", "Shop 1", 52489.35),
    ],
    "Shop 2": [
        (1, "2021/04", "Shop 2", 341227.53),
        (4, "2021/04", "Shop 2", 21487.63),
        (2, "2021/05", "Shop 2", 315447.24),
        (8, "2021/05", "Shop 2", 6548.49),
        (9, "2021/06", "Shop 2", 387779.49),
    ],
}

Python相关问答推荐

优化在numpy数组中非零值周围创建缓冲区的函数的性能

列表上值总和最多为K(以O(log n))的最大元素数

线性模型PanelOLS和statmodels OLS之间的区别

在Python中处理大量CSV文件中的数据

使用miniconda创建环境的问题

如何使用它?

如何获取numpy数组的特定索引值?

使用BeautifulSoup抓取所有链接

基于形状而非距离的两个numpy数组相似性

Python Tkinter为特定样式调整所有ttkbootstrap或ttk Button填充的大小,适用于所有主题

Python Pandas—时间序列—时间戳缺失时间精确在00:00

在pandas/python中计数嵌套类别

Python—为什么我的代码返回一个TypeError

巨 Python :逆向猜谜游戏

在电影中向西北方向对齐""

为用户输入的整数查找根/幂整数对的Python练习

如何在验证文本列表时使正则表达式无序?

如何将泛型类类型与函数返回类型结合使用?

将像素信息写入文件并读取该文件

FileNotFoundError:[WinError 2]系统找不到指定的文件:在os.listdir中查找扩展名