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

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

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

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

Я пробовал:

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

Ответ 1

Использование понимание списка:

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

Ответ 2

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

>>> lst=[[1,2,3],[11,12,13],[21,22,23]]
>>> zip(*lst)[0]
(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])

Ответ 3

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

from operator import itemgetter

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

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

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

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

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

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

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

Дополнительная информация: https://docs.python.org/3/library/operator.html#operator.itemgetter

Ответ 4

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

Если вы используете как: (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']

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

Ответ 5

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

print(outputlist) 

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

Ответ 6

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

>>> 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']]

Теперь мы добавили список первых элементов в существующий список. Если вы хотите добавить элементы itemselves, а не список из них, к существующим, вы должны использовать 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

Ответ 7

Не слишком много думая:

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