【问题标题】:Python accessing slices of a list in orderPython按顺序访问列表的切片
【发布时间】:2013-12-10 12:24:27
【问题描述】:

在 Python 2.7 中,我有一个名为 data 的列表,其中包含一些由第一个属性索引的元组,例如

data = [('A', 1, 2, 3), ('A', 10, 20, 30), ('A', 100, 200, 300),
        ('B', 1, 2, 3), ('B', 10, 20, 30),
        ('C', 15, 25, 30), ('C', 1, 20, 22), ('C', 100, 3, 8)]

有一个函数f() 可以在data 的任何切片上使用第一个索引匹配,例如

f( [x[1:] for x in data[:3] )

我想在数组的每个切片(具有相同第一个索引的元组组)上调用f(以正确的顺序)并在列表中编译结果值列表。

我刚刚开始使用 Python。这是我的解决方案,有没有更好(更快或更优雅)的方法来做到这一点?

slices = [x for x in xrange(len(data)) if data[x][0] != data[x-1][0]]
result = [f(data[start:end] for start, end in zip( [slices[:-1], slices[1:] )]

谢谢。

【问题讨论】:

  • 目前尚不清楚您要在这里实现什么。你的意思是你想在每个 group 元组上调用f(),它们在每个元组的第一项上分组?
  • 如果你的数据是由第一个属性索引的,你如何区分As、Bs或Cs?
  • data[x][0] != data[x][-1]data 中始终为真。这意味着您基本上会在 data 上创建一个大小为 2 的滑动窗口。
  • @MartijnPieters 是的,没错,谢谢。
  • @gt6989b:确切地说,什么?对不起,我做了两个陈述;您是想对元组的第一个键进行分组,还是想在data 上创建一个大小为 2 的滑动窗口?

标签: python list python-2.7 slice


【解决方案1】:

如果您想对每个元组的第一项进行分组,可以使用itertools.groupby()

from itertools import groupby
from operator import itemgetter

[f(list(g)) for k, g in groupby(data, key=itemgetter(0))]

itemgetter(0) 返回每​​个元组的第一个元素,groupby() 然后根据该值为每个组提供迭代。遍历每个单独的 g 结果将为您提供一个只有 'A'、然后是 'B' 等的元组序列。

【讨论】:

    猜你喜欢
    • 2018-05-08
    • 1970-01-01
    • 1970-01-01
    • 2017-06-24
    • 2015-02-19
    • 2014-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多