Digamos que tenhamos uma lista de números de 0 a 1000. Existe uma maneira pitônica / eficiente de produzir uma lista do primeiro e de cada décimo item subsequente, ou seja [0, 10, 20, 30, ... ]
?
Sim, eu posso fazer isso usando um loop for, mas estou me perguntando se existe uma maneira mais clara de fazer isso, talvez até em uma linha?
0
é redundante eml[0::10]
.l[::10]
é mais legível, menos confuso.source_list[::10]
é o mais óbvio, mas isso não funciona para qualquer iterável e não é eficiente em termos de memória para listas grandes.itertools.islice(source_sequence, 0, None, 10)
funciona para qualquer iterável e economiza memória, mas provavelmente não é a solução mais rápida para grandes listas e grandes etapas.(source_list[i] for i in xrange(0, len(source_list), 10))
fonte
Você pode usar o operador de fatia assim:
fonte
L[2::2]
Do manual:
s[i:j:k] slice of s from i to j with step k
fonte
Isso seleciona todos os 10 elementos da lista.
fonte
Por que não usar apenas um parâmetro step da função range para obter:
Para comparação, na minha máquina:
fonte
fonte
Aqui está uma melhor implementação de uma compreensão da lista de "cada 10 itens", que não usa o conteúdo da lista como parte do teste de associação:
Mas isso ainda é muito mais lento do que apenas usar o fatiamento de lista.
fonte
As compreensões de lista são feitas exatamente para isso:
Você pode obter mais informações sobre eles na documentação oficial do python: http://docs.python.org/tutorial/datastructures.html#list-comprehensions
fonte