首页 > 解决方案 > 使用列表推导按特定字符拆分和内爆元组列表

问题描述

我有以下格式的元组列表

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]

编辑:

删除了一个错误[

标签: python

解决方案


您可以使用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 个项目

在不同的假设下,人们可能会得到不同的甚至更简单的结果。


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


推荐阅读