gpt4 book ai didi

Python 如何使用 map() 将列表拆分为子列表?

转载 作者:太空宇宙 更新时间:2023-11-03 13:48:31 24 4
gpt4 key购买 nike

我有这个函数可以按长度、填充值和填充方向将可迭代对象拆分为子列表:

def split(v,size,fill=0,direction='right'):
if size == 0: return []
lenv = len(v)
count = lenv/size
remainder = lenv%size
result = []
for i in range(0,lenv-remainder,size):
result.append(v[i:i+size])
if remainder > 0:
if direction == 'right':
result.append(v[count*size:] + [fill] * (size-remainder))
else:
result.append([fill] * (size-remainder) + v[count*size:])
return result

因为我喜欢一个类轮我想用 map 重写它,但我不知道该怎么做。到目前为止我有这个:

def j1(a,b): 
return a + b

def j2(a,b):
return b

def split2(v,size,fill=0):
map(j1,(x for x in map(j2,v)))

我不知道。有什么提示吗?

最佳答案

我相信你想多了。使用 grouper recipe 可以恰本地处理这个问题。不使用map

def split1(v,size,fill=0,direction='right'):
result = list(izip_longest(*[iter(l)]*size, fillvalue=fill))
if direction == 'left':
result[-1] = result[-1][::-1]
return result

解释:

  • iter :此函数将序列转换为可迭代对象。 Iterables 是自消耗的,只有一种方法,next它返回 iterable 的下一个元素,从左到右移动。
  • [iter(l)]*size : 创建 size 的列表可迭代
  • * (Kleene star) : 该运算符用于解包列表或元组
  • izip_longest : 转置元素。对于较短的序列,由填充值填充
  • result[-1] = result[-1][::-1] : 如果方向是left反转最后一个序列

没有石斑鱼的另一种可能的流行解决方案是

def split2(v,size,fill=0,direction='right'):
result = [v[i:i+size] for i in range(0,len(v),size)]
result[-1] = result[-1] + [fill] * (size - len(result[-1]))
if direction == 'left':
result[-1] = result[-1][::-1]
return result

解释:

  • 使用 Python 的 Extended Slice .序列切片具有以下语法 [start: end: stride]
  • Python Range 返回一个列表(在 Py2.x 中)和一个范围对象(在 Py 3.x 中)作为序列/可迭代对象,从 start 开始,结束于 end和步进stride元素。类似于 (for int i = start; i < stop; i+= stride)
  • [fill] * (size - len(result[-1])) : 生成 (size - len(result[-1])) fill元素作为列表。如果(size - len(result[-1])) <=0 它生成一个空列表
  • result[-1] = result[-1] + [fill] * (size - len(result[-1])) - 用填充值更新最后一个序列
  • result[-1] = result[-1][::-1] : 如果方向是left反转最后一个序列

关于Python 如何使用 map() 将列表拆分为子列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14577843/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com