Мне интересно, как лучше всего извлечь первый элемент каждого подсписка в списке списков и добавить его в новый список. Так что если у меня есть:
lst = [[a,b,c], [1,2,3], [x,y,z]]
и я хочу , чтобы вытащить a
, 1
а x
и создать отдельный список из них.
Я попытался:
lst2.append(x[0] for x in lst)
Ответы:
Используя понимание списка :
источник
Вы можете использовать zip:
Или Python 3, где
zip
не создается список:Или,
Или, (мой любимый) использовать NumPy:
источник
list
его сначала или используйnext
. СпасибоВозникла такая же проблема и стало любопытно по поводу производительности каждого решения.
Вот это
%timeit
:Первый тупой способ преобразования массива:
Полностью родной, используя списочное понимание (как объяснено @alecxe):
Другой родной способ использования
zip
(как объяснено @dawg):Второй тупой путь. Также объясняется @dawg:
Удивительно (ну, по крайней мере, для меня) родной способ использования списочного понимания самый быстрый и примерно в 10 раз быстрее, чем тупой путь. Запуск двух тупиков без финала
list
экономит около одного мкс, что все еще в 10-кратной разнице.Обратите внимание, что, когда я окружил каждый фрагмент кода вызовом
len
, чтобы убедиться, что Генераторы работают до конца, время остается неизменным.источник
В Python есть функция itemgetter, которая возвращает элемент по определенному индексу в списке:
Передайте функции itemgetter () индекс элемента, который вы хотите получить. Чтобы получить первый элемент, вы должны использовать itemgetter (0). Важно понимать, что itemgetter (0) сам возвращает функцию. Если вы передадите список этой функции, вы получите конкретный элемент:
Это полезно, когда вы комбинируете его с map (), который принимает функцию в качестве первого аргумента, и список (или любой другой итерируемый) в качестве второго аргумента. Возвращает результат вызова функции для каждого объекта в итерируемой:
Обратите внимание, что map () возвращает генератор, поэтому результат передается в list () для получения фактического списка. Таким образом, ваша задача может быть выполнена следующим образом:
Это альтернативный метод для использования понимания списка, и какой метод выбрать сильно зависит от контекста, читаемости и предпочтений.
Дополнительная информация: https://docs.python.org/3/library/operator.html#operator.itemgetter
источник
Ваш код почти правильный. Единственная проблема - использование понимания списка.
Если вы используете like: (x [0] для x в lst), он возвращает объект генератора. Если вы используете вроде: [x [0] для x в lst], он возвращает список.
Когда вы добавляете вывод понимания списка в список, вывод понимания списка является единственным элементом списка.
lst2 = [['a', 1, 'x']]
lst2 [0] = ['a', 1, 'x']
Пожалуйста, дайте мне знать, если я ошибаюсь.
источник
Вывод:
['a', 1, 'x']
источник
Вы сказали, что у вас есть существующий список. Так что я пойду с этим.
Прямо сейчас вы добавляете объект генератора в свой второй список.
Но вы, вероятно, хотите, чтобы это был список первых пунктов
Теперь мы добавили список первых элементов в существующий список. Если вы хотите добавить элементы темы, а не список, к уже существующим, вы должны использовать list.extend. В этом случае нам не нужно беспокоиться о добавлении генератора, потому что расширение будет использовать этот генератор для добавления каждого элемента, который он получает оттуда, для расширения текущего списка.
или
https://docs.python.org/3.4/tutorial/datastructures.html#more-on-lists https://docs.python.org/3.4/tutorial/datastructures.html#list-comprehensions
источник
append
в вопросе вызывает путаницу. Похоже, он / она просто хочет, чтобы часть вашего решения содержала понимание списка.