Pythonic способ вернуть список каждого n-го элемента в больший список

    

http://www.encodedna.com/2013/05/enter-only-numbers-using-jquery.htm

143
задан nbro 24 May 2017 в 16:19
поделиться

9 ответов

>>> lst = list(range(165))
>>> lst[0::10]
[0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160]

Обратите внимание, что это примерно в 100 раз быстрее, чем цикл и проверка модуля для каждого элемента:

$ python -m timeit -s "lst = list(range(1000))" "lst1 = [x for x in lst if x % 10 == 0]"
1000 loops, best of 3: 525 usec per loop
$ python -m timeit -s "lst = list(range(1000))" "lst1 = lst[0::10]"
100000 loops, best of 3: 4.02 usec per loop
251
ответ дан 23 November 2019 в 22:23
поделиться

Оператор среза можно использовать следующим образом:

l = [1,2,3,4,5]
l2 = l[::2] # get subsequent 2nd item
23
ответ дан 23 November 2019 в 22:23
поделиться
newlist = oldlist[::10]

Выбирает каждый 10-й элемент списка.

11
ответ дан 23 November 2019 в 22:23
поделиться

Из руководства: s [i: j: k] срез s от i до j с шагом k

li = range(100)
sub = li[0::10]

>>> sub
[0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
15
ответ дан 23 November 2019 в 22:23
поделиться

Списки составлены именно для этого:

smaller_list = [x for x in range(100001) if x % 10 == 0]

Вы можете получить больше информации о них в официальной документации python: http://docs.python.org/tutorial/datastructures.html#list-comprehensions

-9
ответ дан 23 November 2019 в 22:23
поделиться
existing_list = range(0, 1001)
filtered_list = [i for i in existing_list if i % 10 == 0]
2
ответ дан 23 November 2019 в 22:23
поделиться
  1. source_list [:: 10] является наиболее очевидным, но это не работает для любой итерации и неэффективно с точки зрения памяти для больших списков.
  2. itertools.islice (source_sequence, 0, None, 10) работает для любой итерации и эффективно использует память, но, вероятно, это не самое быстрое решение для большого списка и большого шага.
  3. (source_list [i] for i in xrange (0, len (source_list), 10) ))
47
ответ дан 23 November 2019 в 22:23
поделиться

Почему бы просто не использовать параметр step функции range , чтобы получить:

l = range(0, 1000, 10)

Для сравнения на моя машина:

H:\>python -m timeit -s "l = range(1000)" "l1 = [x for x in l if x % 10 == 0]"
10000 loops, best of 3: 90.8 usec per loop
H:\>python -m timeit -s "l = range(1000)" "l1 = l[0::10]"
1000000 loops, best of 3: 0.861 usec per loop
H:\>python -m timeit -s "l = range(0, 1000, 10)"
100000000 loops, best of 3: 0.0172 usec per loop
2
ответ дан 23 November 2019 в 22:23
поделиться

Вот лучшая реализация понимания списка «каждый 10-й элемент», которая не использует содержимое списка как часть теста членства:

>>> l = range(165)
>>> [ item for i,item in enumerate(l) if i%10==0 ]
[0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160]
>>> l = list("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
>>> [ item for i,item in enumerate(l) if i%10==0 ]
['A', 'K', 'U']

Но это все еще намного медленнее, чем просто с использованием нарезки списка.

1
ответ дан 23 November 2019 в 22:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: