如果我有这份清单:
y =[a,b,c,d,e,f]我想选择a和b,然后选择e和f,它的语法是什么?
我试过:
y = [a,b,c,d,e,f,g,h,i,j]
for letter in range(0,len(y),2):
print(letter)我想要的结果是
[a, b, e, f i,j]相反,我每收到一封信:
a
c
e
g
i 当我尝试使用片表示法print(y:1)时,我只得到列表中的前两个值。
发布于 2021-05-20 22:09:34
最简单的方法是使用一个if-子句('filter')来理解列表,该子句将选择您想要的跨度中的项。
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]]为了更好地阐明这一点,我们要做的是做一个清单理解:
ls_spans = [x for x in ls] # Essentially just copies the list但我们只想选择“span”的某些成员,我们将其标识为4个单位的长度:(列表中的abcd、efgh、ij )。
ls_spans = [x for x in ls if x_is_wanted()]要做到这一点,因为我们是否需要x取决于它的位置,所以我们使用enumerate将列表中的每个元素与一个索引(下面的列表理解中的i )配对:
ls_spans = [x for i, x in enumerate(ls) if x_is_wanted(i)]现在,我们考虑函数x_is_wanted,它必须对每个元素说'yes‘或'no’(True或False):
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.完整的程序可能看起来像:
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)]但是,如果我们不需要重用这个函数,我们可以更容易地将其内联:
# 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]发布于 2021-05-20 21:58:25
您需要将步骤设置为4,对于每4项,您需要前两项(3和4被跳过)。因此:
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)发布于 2021-05-20 22:01:46
如果迭代实际上只是一个字符串/字符集合:
from textwrap import wrap
from itertools import chain
print(list(chain.from_iterable(wrap("abcdefghij", 2)[::2])))输出:
['a', 'b', 'e', 'f', 'i', 'j']
>>> 如果它是任意迭代的:
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))))输出:
['a', 'b', 'e', 'f', 'i', 'j']
>>> https://stackoverflow.com/questions/67628344
复制相似问题