【问题标题】:How to construct a list of grouped item based on another list in python? [duplicate]python - 如何根据python中的另一个列表构建分组项目列表? [复制]
【发布时间】:2012-03-16 20:46:02
【问题描述】:

可能重复:
iterate through pairs of items in python list

我有一个列表,我想创建另一个列表,它将包含第一个项目的后续组,基于一个滑动窗口参数和每个组的大小。即如果参数:

a = ["a" ,"b" ,"c" ,"d" ,"e" ,"f"]

滑动窗口=1 大小=2 然后我想要 b 为:

b= [(a,b),(b,c),(c,d),(d,e),(e,f)]

滑动窗口用于决定下一个元组的索引。每次列表将遍历 1.I.e:如果滑动窗口为 2,那么我将: b= [(a,b),(c,d),(e,f)]

我正在寻找实现这一目标的 Python 方式。

【问题讨论】:

  • 一段丑陋的代码保存每次索引,增加直到在第一个循环中构造第一个元组的大小,然后将初始索引增加窗口大小,依此类推。我猜有 map 和 lambda 的东西会让它更漂亮

标签: python


【解决方案1】:

来自Python documentation

from itertools import tee, izip, islice

def pairwise(iterable, size=2, slide=1):
    iters = [islice(it, i, None, slide) for i, it in enumerate(tee(iterable, size))]
    return izip(*iters)

Demo :P Timeit 说:

In [58]: timeit pairwise(xrange(1000))
100000 loops, best of 3: 4.6 us per loop

【讨论】:

  • 这对sliding-window = 2size = 4 有什么作用?
  • 滑动窗口是什么意思?我将其修复为使用 n 作为大小。
  • 我编辑了滑动窗口的答案。
  • 您的问题似乎没有仔细阅读。
  • @FelixKling 我写这个答案的时候问题里没有关于滑动窗口的信息……
【解决方案2】:

itertools recipes

from itertools import tee, izip
def pairwise(iterable):
    a, b = tee(iterable)
    next(b, None)
    return izip(a, b)

for v, w in pairwise(a):
    (...)

【讨论】:

    【解决方案3】:

    这是一种方式:

    def group(l, window, size):
        return [l[index:index + size] for index in xrange(0, len(l) - 1, window)]
    

    DEMO

    【讨论】:

    • 虽然你可能想让它成为一个生成器而不是一个理解列表,因为你使用的是 xrange。
    • @e-satis:这是一个选项,但我只是不想在内存中有一个我不需要的数字列表。
    • 不,我的意思是把 [] 变成 ()。因此,除非用户明确要求,否则内存中根本没有列表。
    【解决方案4】:

    你可以这样试试:

    def slice(initial_list, length):
        return [ initial_list[i:i+length] for i in xrange(len(initial_list)-1)]
    

    这会给:

    a = ["a" ,"b" ,"c" ,"d" ,"e" ,"f"]
    print slice(a, 2)
    >>> [['a', 'b'], ['b', 'c'], ['c', 'd'], ['d', 'e'], ['e', 'f']]
    

    【讨论】:

      【解决方案5】:

      这里与@Secator 建议的相同,但不使用 itertools

      i = iter(a)
      next(i)
      result = zip(a,i)
      

      【讨论】:

      • 这如何处理不同的滑动窗口和大小值?
      猜你喜欢
      • 1970-01-01
      • 2018-08-23
      • 1970-01-01
      • 2015-12-13
      • 1970-01-01
      • 2022-12-22
      • 2021-01-21
      • 2019-01-26
      • 2013-04-24
      相关资源
      最近更新 更多