python列表分割_关于python:将列表分割成较小的列表(对半分割)

我正在寻找一种方法可以轻松地将python列表分成两半。

这样,如果我有一个数组:

1A = [0,1,2,3,4,5]

我将能够得到:

1

2

3B = [0,1,2]

C = [3,4,5]

1

2

3A = [1,2,3,4,5,6]

B = A[:len(A)//2]

C = A[len(A)//2:]

如果需要功能:

1

2

3

4

5

6def split_list(a_list):

half = len(a_list)//2

return a_list[:half], a_list[half:]

A = [1,2,3,4,5,6]

B, C = split_list(A)

您需要在Python 3中强制进行int除法。//是必需的。

好的解决方案,谢谢。它还适用于Python3 B = A[:(len(A) 10) * 8] C = A[(len(A) 10) * 8:]中的分数80/20

一些通用的解决方案(您可以指定所需的零件数量,而不仅仅是"分成两半"):

编辑:更新后以处理奇数列表长度

EDIT2:根据Brians的丰富评论再次更新帖子

1

2

3

4

5

6

7

8

9

10def split_list(alist, wanted_parts=1):

length = len(alist)

return [ alist[i*length // wanted_parts: (i+1)*length // wanted_parts]

for i in range(wanted_parts) ]

A = [0,1,2,3,4,5,6,7,8,9]

print split_list(A, wanted_parts=1)

print split_list(A, wanted_parts=2)

print split_list(A, wanted_parts=8)

当列表没有平均划分时(例如split_list([1,2,3],2)),这实际上将返回wanted_pa??rts + 1列表。

没错,我怀疑应该采用什么正确的方法(再增加一部分,或者在最后一个清单中再增加一个项目)。病态更新了我的帖子,谢谢评论。

实际上,这仍然行不通:您的余数可能大于1。split_list(range(5),3)将使用上述代码给出5个列表。处理这些情况也比较棘手,因为您需要将列表均匀分布(例如,对于19个元素列表(分为10个部分),您不希望9 * 1的项,而希望9的项)。

我认为更好的方法是:length = len(alist);返回[alist [i * length // wanted_pa??rts:(i + 1)* length // wanted_pa??rts] for range in(wanted_pa??rts)]。这样一来,您将获得尽可能均匀的分布,并始终获得完全通缉的物品(如果通缉的物品> len(A),甚至可以使用[]填充)

非常好的解决方案,非常感谢。也比我想的要短得多...不适更新我的帖子。

嗨..符号" //"是什么意思?

@Fraz它的意思是内联注释。忽略" // wanted_pa??rts"和" // wanted_pa??rts"以使脚本执行。

表示整数除法。不应该将它们排除在外,因为它们在完成这项工作中非常重要。

1

2f = lambda A, n=3: [A[i:i+n] for i in range(0, len(A), n)]

f(A)

n-结果数组的预定义长度

这在我的情况下效果很好,但是它将每个列表的所有其他最后索引附加到其自己的列表中。难以解释。如果您可以提供帮助,请回复,我会进一步解释。

1

2

3

4

5

6

7

8def split(arr, size):

arrs = []

while len(arr) > size:

pice = arr[:size]

arrs.append(pice)

arr = arr[size:]

arrs.append(arr)

return arrs

测试:

1

2x=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]

print(split(x, 5))

结果:

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

我非常感谢您将答案的格式设置为"功能" +"测试" +"结果"!

将列表转换为矩阵也很有用

这行得通,但并不完全。我在循环中使用此函数,并且长度各不相同。换句话说:for i,j in zip(list,lengths): print(split(i,j))。 list和lengths列表具有相同的长度。 j是交替的:5、4、5、4、5,并且split函数作用于前两个交替,即它将list的第一个i分别除以5和4,但在下一次迭代中将其拆分为4 ,4,1。 :如果您想让我解释更多信息,请回复(发布新问题)

B,C=A[:len(A)/2],A[len(A)/2:]

我认为您忘记了两步除法。 :)

这是一个常见的解决方案,将arr分成计数部分

1

2def split(arr, count):

return [arr[i::count] for i in range(count)]

这会失去列表的顺序

如果您不在乎订单...

1

2def split(list):

return list[::2], list[1::2]

list[::2]从第0个元素开始获取列表中的第二个元素。

list[1::2]从第一个元素开始获取列表中的第二个元素。

仔细给arg list命名,并隐藏内置的list(...)。我见过lst和list_通常用于避免它。

这感觉最pythonic(忽略不正确的命名)

1

2

3

4

5def splitter(A):

B = A[0:len(A)//2]

C = A[len(A)//2:]

return (B,C)

我进行了测试,在python 3中强制进行int分割需要使用双斜杠。我的原始帖子是正确的,尽管wysiwyg由于某种原因在Opera中中断了。

它不处理奇数len(A)-您对此有解决方案吗?

对于将数组拆分为大小为n的较小数组的更通用的情况,有一个官方的Python记录。

1

2

3

4

5

6from itertools import izip_longest

def grouper(n, iterable, fillvalue=None):

"Collect data into fixed-length chunks or blocks"

# grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx

args = [iter(iterable)] * n

return izip_longest(fillvalue=fillvalue, *args)

该代码段来自python itertools doc页面。

使用列表切片。语法基本上是my_list[start_index:end_index]

1

2

3

4

5>>> i = [0,1,2,3,4,5]

>>> i[:3] # same as i[0:3] - grabs from first to third index (0->2)

[0, 1, 2]

>>> i[3:] # same as i[3:len(i)] - grabs from fourth index to end

[3, 4, 5]

要获得列表的前半部分,请从第一个索引切成len(i)//2(其中//是整数除法-因此3//2 will give the floored result of 1 , instead of the invalid list index of 1.5`):

1

2>>> i[:len(i)//2]

[0, 1, 2]

..并交换周围的值以获得下半部分:

1

2>>> i[len(i)//2:]

[3, 4, 5]

奇数镜头列表怎么样?

@ N997代码仍然可以使用;您最终在每个列表中得到不同数量的项目。所以说列表长三项,除法运算符将结果取底,因此32给出1,然后得到i[:1]给出[0]和i[1:]给出[1, 2]

10年后..我想-为什么不添加另一个:

1

2arr = 'Some random string' * 10; n = 4

print([arr[e:e+n] for e in range(0,len(arr),n)])

尽管上面的答案或多或少是正确的,但如果数组的大小不能被2整除,您可能会遇到麻烦,因为a / 2的结果很奇怪,在python 3.0和更早的版本中是float如果在脚本开头指定from __future__ import division,则为版本。无论如何,您最好进行整数除法,即a // 2,以获得代码的"前向"兼容性。

如果列表很大,最好使用itertools并编写一个函数以根据需要生成每个部分:

1

2

3

4

5

6

7from itertools import islice

def make_chunks(data, SIZE):

it = iter(data)

# use `xragne` if you are in python 2.7:

for i in range(0, len(data), SIZE):

yield [k for k in islice(it, SIZE)]

您可以这样使用:

1

2

3

4

5

6A = [0, 1, 2, 3, 4, 5, 6]

size = len(A) // 2

for sample in make_chunks(A, size):

print(sample)

输出为:

1

2

3[0, 1, 2]

[3, 4, 5]

[6]

感谢@thefourtheye和@Bede Constantinides

来自@ChristopheD的提示

1

2

3

4

5

6

7def line_split(N, K=1):

length = len(N)

return [N[i*length/K:(i+1)*length/K] for i in range(K)]

A = [0,1,2,3,4,5,6,7,8,9]

print line_split(A,1)

print line_split(A,2)

这与其他解决方案相似,但速度更快。

1

2

3

4

5# Usage: split_half([1,2,3,4,5]) Result: ([1, 2], [3, 4, 5])

def split_half(a):

half = len(a) >> 1

return a[:half], a[half:]

1

2

3

4

5#for python 3

A = [0,1,2,3,4,5]

l = len(A)/2

B = A[:int(l)]

C = A[int(l):]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值