当前位置: 首页 > 面试题库 >

将元组列表拆分为相同元组字段的子列表

公西浩
2023-03-14
问题内容

我有大量的这种格式的元组列表。每个元组的第二个字段是类别字段。

    [(1, 'A', 'foo'),
    (2, 'A', 'bar'),
    (100, 'A', 'foo-bar'),

    ('xx', 'B', 'foobar'),
    ('yy', 'B', 'foo'),

    (1000, 'C', 'py'),
    (200, 'C', 'foo'),
    ..]

将其分解为相同类别(A,B,C等)的子列表的最有效方法是什么?


问题答案:

使用itertools.groupby:

import itertools
import operator

data=[(1, 'A', 'foo'),
    (2, 'A', 'bar'),
    (100, 'A', 'foo-bar'),

    ('xx', 'B', 'foobar'),
    ('yy', 'B', 'foo'),

    (1000, 'C', 'py'),
    (200, 'C', 'foo'),
    ]

for key,group in itertools.groupby(data,operator.itemgetter(1)):
    print(list(group))

产量

[(1, 'A', 'foo'), (2, 'A', 'bar'), (100, 'A', 'foo-bar')]
[('xx', 'B', 'foobar'), ('yy', 'B', 'foo')]
[(1000, 'C', 'py'), (200, 'C', 'foo')]

或者,要创建一个将每个组作为子列表的列表,可以使用列表理解:

[list(group) for key,group in itertools.groupby(data,operator.itemgetter(1))]

to的第二个参数itertools.groupby是一个itertools.groupby适用于data(第一个参数)中每个项目的函数。预期会传回keyitertools.groupby然后将相同的所有连续项目组合在一起key

operator.itemgetter(1)提取序列中的第二项。

例如,如果

row=(1, 'A', 'foo')

然后

operator.itemgetter(1)(row)

等于'A'

正如@eryksun在评论中指出的那样,如果元组的类别以某种随机顺序出现,那么您必须data在应用之前首先进行排序itertools.groupby。这是因为itertools.groupy仅将具有相同密钥的
连续 项目收集到组中。

要按类别对元组进行排序,请使用:

data2=sorted(data,key=operator.itemgetter(1))


 类似资料:
  • 问题内容: 我有这个清单(): 我想要这样的东西: 换句话说,我想使用值作为分隔符将列表拆分为子列表,以获得列表列表()。我正在寻找Java 8解决方案。我已经尝试过,但是我不确定这是我要找的东西。谢谢! 问题答案: 我目前想出的唯一解决方案是实现自己的自定义收集器。 在阅读解决方案之前,我想添加一些有关此的注释。我将这个问题更多地当作编程练习,我不确定是否可以使用并行流来完成。 因此,您必须意识

  • 问题内容: 我有一个这样的(标签,计数)元组列表: 由此,我想对所有具有相同标签的值求和(相同的标签始终相邻),并以相同的标签顺序返回列表: 我知道我可以用以下方法解决它: 但是,有没有更Pythonic /优雅/有效的方法来做到这一点? 问题答案: 可以做你想做的:

  • 问题内容: 我如何转换 至 问题答案: 使用简单的列表理解: 会给你:

  • 问题内容: 我已经编写了此函数,用于将元组列表转换为列表列表。有没有更优雅的/ Pythonic的方式来做到这一点? 问题答案: 您可以使用列表推导:

  • 问题:如何将列表拆分为两个子列表,其中元素由元素中的选项卡分隔? 上下文:我想读取一个由制表符分隔的文件到Pandas DataFrame中。这些文件看起来像: 列1\t 123 列2\t 列3\t文本 这意味着每行有一列,后面跟着一个选项卡,然后是该列的一个值(有时没有值)。 我的想法是读取文件并将每行保存为列表的元素,然后将列表分成两个,将选项卡前的第一部分作为一个列表,选项卡后的第二部分作为

  • 问题内容: 我有以下内容,行索引在哪里。如何将列中的字符串分成5列数字? 问题答案: 对于另一种情况,假设它是看起来像元组的字符串: (注意:对于较早版本的熊猫(<0.16.1),您需要使用而不是expand关键字) 顺便说一句,如果它是元组而不是字符串,则可以简单地执行以下操作: