Извлечение первого элемента каждого подсписка в python



мне интересно, как лучше всего извлечь первый элемент каждого подсписка в списке списков и добавить его в новый список. Так что если у меня есть:



 lst = [[a,b,c], [1,2,3], [x,y,z]]


и я хочу вытащить a, 1 и x и создать отдельный список из них.



пробовал:



lst2.append(x[0] for x in lst)
457   7  

7 ответов:

С помощью понимание:

>>> lst = [['a','b','c'], [1,2,3], ['x','y','z']]
>>> lst2 = [item[0] for item in lst]
>>> lst2
['a', 1, 'x']

вы можете использовать zip:

>>> lst=[[1,2,3],[11,12,13],[21,22,23]]
>>> zip(*lst)[0]
(1, 11, 21)

или, Python 3 где zip не создает список:

>>> list(zip(*lst))[0]
(1, 11, 21)

или

>>> next(zip(*lst))
(1, 11, 21)

или (мой любимый) использовать библиотеки numpy:

>>> import numpy as np
>>> a=np.array([[1,2,3],[11,12,13],[21,22,23]])
>>> a
array([[ 1,  2,  3],
       [11, 12, 13],
       [21, 22, 23]])
>>> a[:,0]
array([ 1, 11, 21])

Python включает в себя функцию itemgetter для возврата элемента по определенному индексу в списке:

from operator import itemgetter

передайте функции itemgetter () индекс элемента, который вы хотите получить. Чтобы получить первый элемент, вы должны использовать itemgetter (0). Важно понимать, что itemgetter(0) сам возвращает функция. Если вы передадите список этой функции, вы получите конкретный элемент:

itemgetter(0)([10, 20, 30]) # Returns 10

это полезно, когда вы объединяете его с map (), который принимает функцию в качестве первого аргумента, а список (или любой другой итерационный) в качестве второго аргумента. Она возвращает результат вызова функции для каждого объекта в массиве:

my_list = [['a', 'b', 'c'], [1, 2, 3], ['x', 'y', 'z']]
list(map(itemgetter(0), my_list)) # Returns ['a', 1, 'x']

обратите внимание, что map() возвращает генератор, поэтому результат передается в list (), чтобы получить фактический список. Таким образом, ваша задача может быть выполнена следующим образом:

lst2.append(list(map(itemgetter(0), lst)))

это альтернативный метод использования понимания списка, и какой метод выбрать сильно зависит от контекста, читаемость и предпочтения.

Подробнее: https://docs.python.org/3/library/operator.html#operator.itemgetter

была та же проблема, и мне стало любопытно о производительности каждого решения.

вот это %timeit:

import numpy as np
lst = [['a','b','c'], [1,2,3], ['x','y','z']]

первый numpy-способ, преобразующий массив:

%timeit list(np.array(lst).T[0])
4.9 µs ± 163 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

полностью родной, используя список понимания (как объяснил @alecxe):

%timeit [item[0] for item in lst]
379 ns ± 23.1 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

другой родной способ использования zip (как объяснил @dawg):

%timeit list(zip(*lst))[0]
585 ns ± 7.26 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

второй numpy-путь. Также объясняется @dawg:

%timeit list(np.array(lst)[:,0])
4.95 µs ± 179 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

удивительно (ну, по крайней мере для меня) родной способ использования понимания списка является самым быстрым и примерно в 10 раз быстрее, чем numpy-way. Запуск двух numpy-способов без финала list сохраняет около одного МКС, который все еще находится в разнице 10x.

обратите внимание, что, когда я окружен каждый фрагмент кода с вызовом len, чтобы гарантировать, что генераторы работают до конца, время осталось прежним.

ваш код почти правильный. Единственная проблема-это использование понимания списка.

Если вы используете like: (x[0] для x в lst), он возвращает объект генератора. Если вы используете как: [x[0] для x в lst], он возвращает список.

когда вы добавляете вывод понимания списка в список, вывод понимания списка является единственным элементом списка.

lst = [["a","b","c"], [1,2,3], ["x","y","z"]]
lst2 = []
lst2.append([x[0] for x in lst])
print lst2[0]

lst2 = [['a', 1, 'x']]

lst2[0] = ['a', 1, 'x']

пожалуйста, дайте мне знайте, если я ошибаюсь.

lst = [['a','b','c'], [1,2,3], ['x','y','z']]
outputlist = []
for values in lst:
    outputlist.append(values[0])

print(outputlist) 

выход: ['a', 1, 'x']

Вы сказали, что у вас уже есть список. Так что я пойду с этим.

>>> lst1 = [['a','b','c'], [1,2,3], ['x','y','z']]
>>> lst2 = [1, 2, 3]

прямо сейчас вы добавляете объект генератора во второй список.

>>> lst2.append(item[0] for item in lst)
>>> lst2
[1, 2, 3, <generator object <genexpr> at 0xb74b3554>]

но вы, вероятно, хотите, чтобы это был список первых пунктов

>>> lst2.append([item[0] for item in lst])
>>> lst2
[1, 2, 3, ['a', 1, 'x']]

теперь мы добавили список первых элементов к существующему списку. Если вы хотите добавить элементы themeselves, а не список из них, к существующим, вы бы использовали list.расширять. В этом случае нам не нужно беспокоиться о добавлении генератор, потому что extend будет использовать этот генератор для добавления каждого элемента, который он получает оттуда, чтобы расширить текущий список.

>>> lst2.extend(item[0] for item in lst)
>>> lst2
[1, 2, 3, 'a', 1, 'x']

или

>>> lst2 + [x[0] for x in lst]
[1, 2, 3, 'a', 1, 'x']
>>> lst2
[1, 2, 3]

https://docs.python.org/3.4/tutorial/datastructures.html#more-on-lists https://docs.python.org/3.4/tutorial/datastructures.html#list-comprehensions

Comments

    Ничего не найдено.