Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 每个P数取N个数_Python_List - Fatal编程技术网

Python 每个P数取N个数

Python 每个P数取N个数,python,list,Python,List,我想把一个列表分成N个对象,每p个对象组成一个列表 为了简单起见,我有一个INT列表: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] 如果我想每2个对象取2个对象,我希望: [1, 2], [3, 4], [5, 6], [7, 8], [9, 10], [11, 12] 现在,每3个对象有2个对象: [2, 3], [5, 6], [8, 9], [11, 12] 什么是最适合做这件事的方式?切片和拉链怎么样: a = [i for i in ra

我想把一个列表分成N个对象,每p个对象组成一个列表

为了简单起见,我有一个INT列表:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
如果我想每2个对象取2个对象,我希望:

[1, 2], [3, 4], [5, 6], [7, 8], [9, 10], [11, 12]
现在,每3个对象有2个对象:

[2, 3], [5, 6], [8, 9], [11, 12]

什么是最适合做这件事的方式?

切片和拉链怎么样:

a = [i for i in range(13)]
print('a =',a)

offset = 1
step = 2
b = [(x,y) for x,y in zip(a[offset::step],a[offset+1::step])]
print('b =', b)

offset = 2
step = 3
c = [(x,y) for x,y in zip(a[offset::step],a[offset+1::step])]
print('c =',c)
给予

编辑

要将上述情况推广到任意N和p,可以使用切片进行列表索引:

def list_segmenter(L, N, P):
    """small function to segment a list (L) into chunks of size N with step size P"""
    slices = [slice(P+i-1,len(L),P) for i in range(N)]
    lists = [L[s] for s in slices]
    return list(zip(*lists))

a = [i for i in range(13)]

##testing:
print(list_segmenter(a,2,2))
print(list_segmenter(a,2,3))
print(list_segmenter(a,4,3))
输出为:

[(1, 2), (3, 4), (5, 6), (7, 8), (9, 10), (11, 12)]
[(2, 3), (5, 6), (8, 9), (11, 12)]
[(2, 3, 4, 5), (5, 6, 7, 8), (8, 9, 10, 11)]

我猜是一个带n的列表。@r如果我真的理解了你的问题。我只是看不到你在工作中付出的努力。你有没有想出一个有点像python的解决方案,只是想知道是否有一个更像python的解决方案?然后展示你的尝试。或者你只是希望有人以最有可能的方式帮你解决任务?这就是为什么你的问题被否决的原因。我确实试过了,但根本解决不了这个问题。我可以将列表分块到长度为N的子列表中,但无法获得所需的输出。所以我问,我认为这是一个普遍的问题。我的尝试并不精彩。如果问题真的是重复的,我不介意被标记为重复的,但人们只是倾向于快速阅读一个问题,然后说这似乎很简单,一定有人在->downvote之前回答了这个问题,他们不理解这个问题。诀窍是首先将其分为长度为P的子列表,然后将每个子列表的长度减少到N。在您使其工作后,您可以将您的解决方案重构为两个简洁的列表理解,这将是一个非常python的解决方案listzipa[offset::step],这里也可以使用[offset+1::step]。@RoadRunner True。你认为有巨大的性能差异吗?@RoadRunner我认为你的答案对N=2和P=2不适用。我得到的是[2,3,4,5,6,7,8,9,10,11]而不是[1,2,3,4,5,6,7,8,9,10]@rififif你是说第一个还是第二个?我得到的正是你发布的结果。你使用的是同一个列表作为输入吗?你的答案在@ThomasKühn有效至少在函数列表分割器上,我说的是@RoadRunner comment listzipa[offset::step],一个[offset+1::step],我认为它不适用于2,2。
[(1, 2), (3, 4), (5, 6), (7, 8), (9, 10), (11, 12)]
[(2, 3), (5, 6), (8, 9), (11, 12)]
[(2, 3, 4, 5), (5, 6, 7, 8), (8, 9, 10, 11)]