我有以下格式的元组列表
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个以上的项目
有了不同的假设,人们可能会得到不同的,也许更简单的结果。
就我个人而言,我不希望我最坏的朋友调试这样的代码。