python - 按python中的第一个元素重新组合子列表
问题描述
我有一个看起来像这样的嵌套列表:
first_list = [[a, 1], [b, 3], [a, 6], [a, 2], [b, 4], [b, 5], ...]
我想按它们的第一个元素对它们进行分组,并创建一个新的嵌套列表,如下所示:
new_list = [ [1, 6, 2, ...], [3, 4, 5, ...], ...]
其中所有以 go 开头的元素都在第一个子列表中,依此类推。在运行之前不知道不同值 a、b 等的数量,或者我可以执行以下操作:
a_list = []
b_list = []
for tag, x in first_list:
if tag == a:
a_list.append(x)
elif tag == b:
b_list.append(x)
new_list = [a_list, b_list]
但是,我正在努力适应任意数量的标签。
我可能省略了问题的一个重要部分,但我应该说我已经有一个“标签”列表,即:
tags = [a, b, c, d, ...]
它们实际上不是字符,因此没有引号,但它们在任何情况下都应该是可散列的。
解决方案
使用 Python 和一般编程,您应该避免创建可变数量的变量。
默认字典
你可以使用一个defaultdict
对象list
。这自然扩展到任意数量的组,而无需显式命名变量。
first_list = [['a', 1], ['b', 3], ['a', 6], ['a', 2], ['b', 4], ['b', 5]]
from collections import defaultdict
dd = defaultdict(list)
for cat, num in first_list:
dd[cat].append(num)
defaultdict(list, {'a': [1, 6, 2],
'b': [3, 4, 5]})
通过...分组
该defaultdict
解决方案具有 O( n ) 复杂性,但可能有一个恰当命名的itertools.groupby
解决方案,它需要排序和 O( n log n ) 复杂性:
from itertools import groupby
from operator import itemgetter
sorter = sorted(first_list, key=itemgetter(0))
grouper = groupby(sorter, key=itemgetter(0))
res = {i: list(map(itemgetter(1), j)) for i, j in grouper}
{'a': [1, 6, 2], 'b': [3, 4, 5]}
列表输出列表
这就像调用list
on一样微不足道dict.values
:
res_list = list(res.values())
推荐阅读
- dpdk - DPDK 流过滤器获取无效操作错误
- c# - 我有一个组合框,它加载另一个组合框中的另一个值,但第二个组合框的值总是坚持第一次加载的值
- python - 在现有 Python 包中安装 Python 包
- reactjs - 尽管未设置依赖关系,为什么 useEffect 仍在执行?
- c++ - C++字符串类实现
- mysql - 如何回滚在 Magento 2 的 Porto 主题中设置面板上定义的自定义 CSS 和其他设置?
- github - 带有 AWS EC2 CodeDeploy 的 Github
- json - 从 Swift 中的 API 结果以编程方式创建 JSON 数据
- c# - 无法反序列化 JSON 消息,因为 C# 中的属性有空格
- python - 如何在python中单击带有硒的复选框