python - 使用列表推导按特定字符拆分和内爆元组列表
问题描述
我有以下格式的元组列表
l =[('A-B','X'),
('A-C','X'),
('A-D','X'),
('E-F','Y'),
('E-G','Y')]
我想通过拆分第一个元素-
然后将列表理解应用于以下格式来内爆
[('A',['B','C','D'],'X'),
('E',['F','G'],'Y')]
我知道应该有一个简单的衬线来使用列表理解来做到这一点,但很难理解如何拆分元组列表并压缩成一个列表。就像是
[(x[0].split("-")[0], ..... , x[1]) for x in l]
编辑:
删除了一个错误[
解决方案
您可以使用itertools.chain.from_iterable()
,itertools.groupby()
和的组合str.split()
来实现它:
l =[('A-B','X'),
('A-C','X'),
('A-D','X'),
('E-F','Y'),
('E-G','Y')]
r = [(a, list(itertools.chain.from_iterable([c[1:-1] for c in y])), b)
for (a, b), y in itertools.groupby(
sorted(list(itertools.chain.from_iterable(x.split('-') for x in y)) for y in l),
key=lambda x: (x[0], x[-1]))]
print(r)
# [('A', ['B', 'C', 'D'], 'X'), ('E', ['F', 'G'], 'Y')]
首先,“展平”元组内的字符串,然后我groupby
用来获取结果的基本子项。在其中,我再次使用groupby
将所有潜在的“中间元素”作为扁平列表。
该代码包括一些未在问题中指定的选项,例如:
- 我假设拆分的第一个结果和元组的最后一项对于分组都很重要
- 我假设输入可以按第一项排序,以便分组生效
- 我假设结果
str.split()
可能会产生超过 2 个项目
在不同的假设下,人们可能会得到不同的甚至更简单的结果。
就个人而言,我不希望我最坏的恶魔调试这样的代码。
推荐阅读
- javascript - 如何解决 JavaScript 中的堆栈问题?
- kotlin - 智能投不投String?!value.isNullOrBlank() 之后的字符串
- android - 为什么我在 StringReader read() 中得到 IndexOutOfBoundsException?
- http - 与本地主机上的内部反向代理的内部 ServiceFabric 通信
- virtocommerce - 来自 Github 的 virto 商务部署
- html - CSS:强制无线电输入检查
- javascript - 在 Angular JS 中过滤我的 JavaScript 中的未定义
- android - 如何在 Delphi Android 应用程序中调用本机相机?
- c# - 注册表设置值代理仅工作 1 次
- swift - Swift:如何访问字典数组中的字典数组?