Python 基于某些值对列表进行切片
您好,我正在寻找一种基于某些值拆分列表的方法,并假设列表的长度等于某些值的总和,例如: 列表:Python 基于某些值对列表进行切片,python,python-2.7,Python,Python 2.7,您好,我正在寻找一种基于某些值拆分列表的方法,并假设列表的长度等于某些值的总和,例如: 列表:l=['a','b','c','d','e','f'] 值:v=(1,1,2,2) 所以len(l)=和(v) 我想要一个返回元组或列表的函数,比如:(['a'],['b'],['c'],'d'],['d'],['d'],'e']) 目前我的代码如下: (list1,list2,list3,list4) = ( l[0:v[0]], l[v[0]:v[0]+v[1]], l[
l=['a','b','c','d','e','f']
值:v=(1,1,2,2)
所以len(l)=和(v)
我想要一个返回元组或列表的函数,比如:(['a'],['b'],['c'],'d'],['d'],['d'],'e'])
目前我的代码如下:
(list1,list2,list3,list4) = (
l[0:v[0]],
l[v[0]:v[0]+v[1]],
l[v[0]+v[1]:v[0]+v[1]+v[2]],
l[v[0]+v[1]+v[2]:v[0]+v[1]+v[2]+v[3]])`
我正在考虑让这更清楚,但到目前为止最接近我的是(注意结果是不正确的,不是我想要的)
问题是在迭代
v
中的值时,我不能同时增加s
,我希望得到一个更好的代码来这样做,任何建议都非常感谢,谢谢 如果你不是沉迷于古老的Python,我会指给你看。当然,即使是在古老的Python上,也可以使用我链接的文档中提供的(大致)等效代码。使用Py3代码或等效代码,您可以执行以下操作:
from itertools import accumulate # Or copy accumulate equivalent Python code
from itertools import chain
# Calls could be inlined in listcomp, but easier to read here
starts = accumulate(chain((0,), v)) # Extra value from starts ignored when ends exhausted
ends = accumulate(v)
list1,list2,list3,list4 = [l[s:e] for s, e in zip(starts, ends)]
如果你没有被古代巨蟒所困扰,我会指给你看。当然,即使是在古老的Python上,也可以使用我链接的文档中提供的(大致)等效代码。使用Py3代码或等效代码,您可以执行以下操作:
from itertools import accumulate # Or copy accumulate equivalent Python code
from itertools import chain
# Calls could be inlined in listcomp, but easier to read here
starts = accumulate(chain((0,), v)) # Extra value from starts ignored when ends exhausted
ends = accumulate(v)
list1,list2,list3,list4 = [l[s:e] for s, e in zip(starts, ends)]
您只需编写一个简单的循环,在
v
上迭代即可生成结果:
l = ['a','b','c','d','e','f']
v = (1,1,2,2)
result = []
offset = 0
for size in v:
result.append(l[offset:offset+size])
offset += size
print result
输出:
[['a'], ['b'], ['c', 'd'], ['e', 'f']]
您只需编写一个简单的循环,在
v
上迭代即可生成结果:
l = ['a','b','c','d','e','f']
v = (1,1,2,2)
result = []
offset = 0
for size in v:
result.append(l[offset:offset+size])
offset += size
print result
输出:
[['a'], ['b'], ['c', 'd'], ['e', 'f']]
也许可以用l来生成一个值
def make_list(l, v):
g = (x for x in l)
if len(l) == sum(v):
return [[next(g) for _ in range(val)] for val in v]
return None
也许可以用l来生成一个值
def make_list(l, v):
g = (x for x in l)
if len(l) == sum(v):
return [[next(g) for _ in range(val)] for val in v]
return None
这里的想法是使用嵌套循环。假设您的条件始终为真,那么逻辑是运行
v
并从l
中提取i
元素,其中i
是v
中的数字
index = 0 # this is the start index
for num in v:
temp = [] # this is a temp array, to hold individual elements in your result array.
for j in range(index, index+num): # this loop will pickup the next num elements from l
temp.append(l[j])
data.append(temp)
index += num
输出:
第一个答案是最具Python风格的方法。这只是算法的主干 这里的想法是使用嵌套循环。假设您的条件始终为真,那么逻辑是运行v
并从l
中提取i
元素,其中i
是v
中的数字
index = 0 # this is the start index
for num in v:
temp = [] # this is a temp array, to hold individual elements in your result array.
for j in range(index, index+num): # this loop will pickup the next num elements from l
temp.append(l[j])
data.append(temp)
index += num
输出:
第一个答案是最具Python风格的方法。这只是算法的主干 我能找到的最好的解决方案是两行:
breaks=[0]+[sum(v[:i+1]) for i in range(len(v))] #build a list of section indices
result=[l[breaks[i]:breaks[i+1]] for i in range(len(breaks)-1)] #split array according to indices
print result
我能找到的最好的解决方案是两行:
breaks=[0]+[sum(v[:i+1]) for i in range(len(v))] #build a list of section indices
result=[l[breaks[i]:breaks[i+1]] for i in range(len(breaks)-1)] #split array according to indices
print result
这太棒了!我们的整个项目都是基于Python2.7的,这就是为什么我把python-2.7放在标签上,但是仍然非常感谢你的回答,当然我正在寻找的是,看看我是否能得到Python2.7的等效代码。这太棒了!我们的整个项目都是基于Python2.7的,这就是为什么我要添加python-2.7标记,但仍然非常感谢您的回答,我正在寻找的肯定是,我会看看是否可以获得Python2.7的等效代码谢谢!是的,我知道算法主干,如果我可以增加索引,那么我可以得到子列表。谢谢!是的,我知道算法主干,如果我可以增加索引,那么我可以得到子列表。谢谢!实际上,我考虑过list.popleft()并弹出我需要的项目数,但这对我来说实现了同样的效果!仅供参考,将l
转换为具有g=iter(l)
的迭代器要直接得多。这不会增加每项开销,而生成生成器表达式会增加每项开销。谢谢!实际上,我考虑过list.popleft()并弹出我需要的项目数,但这对我来说实现了同样的效果!仅供参考,将l
转换为具有g=iter(l)
的迭代器要直接得多。这不会增加每项开销,而生成生成器表达式会增加每项开销。