首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python对项进行分组并使用步骤循环

Python对项进行分组并使用步骤循环
EN

Stack Overflow用户
提问于 2021-05-20 21:47:47
回答 3查看 47关注 0票数 1

如果我有这份清单:

代码语言:javascript
复制
y =[a,b,c,d,e,f]

我想选择ab,然后选择ef,它的语法是什么?

我试过:

代码语言:javascript
复制
y = [a,b,c,d,e,f,g,h,i,j]
for letter in range(0,len(y),2):
    print(letter)

我想要的结果是

代码语言:javascript
复制
[a, b, e, f i,j]

相反,我每收到一封信:

代码语言:javascript
复制
a
c
e
g
i 

当我尝试使用片表示法print(y:1)时,我只得到列表中的前两个值。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-05-20 22:09:34

最简单的方法是使用一个if-子句('filter')来理解列表,该子句将选择您想要的跨度中的项。

代码语言:javascript
复制
ls = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']
ls_spans = [x for i, x in enumerate(ls) if i % 4 in [0,1]]

为了更好地阐明这一点,我们要做的是做一个清单理解:

代码语言:javascript
复制
ls_spans = [x for x in ls]  # Essentially just copies the list

但我们只想选择“span”的某些成员,我们将其标识为4个单位的长度:(列表中的abcdefghij )。

代码语言:javascript
复制
ls_spans = [x for x in ls if x_is_wanted()]

要做到这一点,因为我们是否需要x取决于它的位置,所以我们使用enumerate将列表中的每个元素与一个索引(下面的列表理解中的i )配对:

代码语言:javascript
复制
ls_spans = [x for i, x in enumerate(ls) if x_is_wanted(i)]

现在,我们考虑函数x_is_wanted,它必须对每个元素说'yes‘或'no’(TrueFalse):

代码语言:javascript
复制
def x_is_wanted(i: int) -> bool:
    span_length = 4
    acceptable_positions = [0, 1]  # Remember we are 0-indexed!
    return i % span_length in acceptable_positions  # We use modulo to get the remainder, which is equivalent to the position in the span.

完整的程序可能看起来像:

代码语言:javascript
复制
def x_is_wanted(i: int) -> bool:
    span_length = 4
    acceptable_positions = [0, 1]  # Remember we are 0-indexed!
    return i % span_length in acceptable_positions    

ls_spans = [x for i, x in enumerate(ls) if x_is_wanted(i)]

但是,如果我们不需要重用这个函数,我们可以更容易地将其内联:

代码语言:javascript
复制
# Play with these params to see what changes!
span_length = 4
acceptable_positions = [0, 1]
ls = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']
ls_spans = [x for i, x in enumerate(ls) if i % span_length in acceptable_positions]
票数 0
EN

Stack Overflow用户

发布于 2021-05-20 21:58:25

您需要将步骤设置为4,对于每4项,您需要前两项(3和4被跳过)。因此:

代码语言:javascript
复制
lst = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']

new_list = []
for i in range(0, len(lst), 4):
    new_list.append(lst[i])
    new_list.append(lst[i + 1])

print(new_list)
票数 1
EN

Stack Overflow用户

发布于 2021-05-20 22:01:46

如果迭代实际上只是一个字符串/字符集合:

代码语言:javascript
复制
from textwrap import wrap
from itertools import chain

print(list(chain.from_iterable(wrap("abcdefghij", 2)[::2])))

输出:

代码语言:javascript
复制
['a', 'b', 'e', 'f', 'i', 'j']
>>> 

如果它是任意迭代的:

代码语言:javascript
复制
from itertools import islice, chain

def chunk_wise(iterable, chunk_size):
    it = iter(iterable)
    while chunk := list(islice(it, chunk_size)):
        yield chunk

print(list(chain.from_iterable(islice(chunk_wise("abcdefghij", 2), 0, None, 2))))

输出:

代码语言:javascript
复制
['a', 'b', 'e', 'f', 'i', 'j']
>>> 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67628344

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档