使用列表理解按特定字符拆分和内爆元组列表

  • 本文关键字:列表 拆分 元组 字符 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个以上的项目

有了不同的假设,人们可能会得到不同的,也许更简单的结果。


就我个人而言,我不希望我最坏的朋友调试这样的代码。

最新更新