Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.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 基于某些值对列表进行切片_Python_Python 2.7 - Fatal编程技术网

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)
的迭代器要直接得多。这不会增加每项开销,而生成生成器表达式会增加每项开销。