将列表列表拆分为长度键控字典的 pythonic 方法?

标签 python list python-3.x dictionary

xs = [
        [1,2,3,4],
        [5,6,7,8],
        [9,0,0,1],
        [2,3],
        [0],
        [5,8,3,2,5,1],
        [6,4],
        [1,6,9,9,2,9]
]

""" expected output:

    xs_dict = {
        1: [[0]]
        2: [[2,3],[6,4]]
        4: [[1,2,3,4],[5,6,7,8],[9,0,0,1]]
        6: [[5,8,3,2,5,1],[1,6,9,9,2,9]]
    }
"""

我可以做到这一点,例如,通过

xs_dict = {}
for x in xs:
    aux = xs_dict.get(len(x),[])
    aux.append(x)
    xs_dict[len(x)] = aux

print(xs_dict)

但我不禁觉得应该有一种更 pythonic 的方式来实现这一目标。

这是什么?

最佳答案

from itertools import groupby

xs_dict = {
    key: list(value)
    for (key, value) in groupby(sorted(xs, key=len), len)
}

正如下面评论中所讨论的,对输入进行必要的排序是一个不必要的步骤。对于大输入,这将比必要的方式减慢该算法的速度。然后考虑使用@hiroprotagonist 的解决方案,或者将 groupby(sorted(…), …) 替换为可以处理未排序输入的 groupby()

关于将列表列表拆分为长度键控字典的 pythonic 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43932593/

相关文章:

list - 是否 `(' a' :_)` represent a tuple or a list?

python - Python 3.2 可以在 Windows 2000 上运行吗?

python - python3中的互斥锁

python - 将一维数组合并为二维数组

python - 我的数据集有超过 10,000 个项目,为什么这没有反射(reflect)在我的列表中?

python - python 如何知道需要通过 api.py 接口(interface) requests 模块?

list - 使用 <ul> 水平换行的 'contact sheet' View 的 CSS

python - 如何覆盖 sys.stdin 以复制输入流

python - 正则表达式删除非字母字符并保留空格

python - 在 cygwin 中安装 scipy