Срезать кортежи в списке (python)

Предположим, у вас есть такой list of tuples:

list_of_tuples = 
    [('11','12','13'),('21','22','23'),('31','32','33'),('41','42','43')]

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

new_list = [('11','12'),('21','22'),('31','32'),('41','42')]

Моей первой попыткой был какой-то синтаксис вроде new_list = list_of_tuples[:][0:2]. Первые скобки [:] индексируют весь список, а [:2] принимают элементы 0 и 1 каждого кортежа. Однако это всегда возвращает первые два кортежа, содержащие все три исходные записи. (Итак, я получаю [('11','12','13'),('21','22','23')]).

Почему это не работает и каково здесь питоническое поведение? Я также заметил, неважно, как я могу писать [:][:][:].

Один из способов получить желаемые результаты - написать понимание списка, подобное этому new_list = [(t[0], t[1]) for t in list_of_tuples], но для этого требуется значительно больше кода, и я также считал свой исходный подход питоническим.

lst[:] нарезает список, но без указания индексов, по сути, вы просто делаете копию списка - так что list_of_tuples[:][0:2] похож на list_of_tuples[:2] - и должно быть ясно, почему это не работает так, как вы ожидаете.
jedwards 12.06.2018 14:01
[:] возвращает весь список, из которого вы вырезаете первые 2 элемента
Juraj Bezručka 12.06.2018 14:01

print [(a [0], a [1]) для входящего списка] попробуйте это

S T Mohammed 12.06.2018 14:24
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
3
1 303
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Ответ принят как подходящий

Первая попытка делает это:

new_list = list_of_tuples[:] # Copy of the list
list_of_tuples[:][0:2] # element 0 to 2 of the copy.

Таким образом, вы получаете 2 первых элемента list_of_tuples:

[('11','12','13'),('21','22','23')]

Вот как работает python ^^ '

Обновлено: И если вы поместите несколько [:], вы просто «копируете» несколько раз исходный список, поэтому не имеет значения, сколько из них вы разместите ...

Это не то, о чем спрашивают, он требует, чтобы в каждом кортеже было только 2 элемента.

Astik Anand 12.06.2018 14:03

@AstikAnand Он просит объяснений. У него уже есть решение с пониманием списка.

Mathieu 12.06.2018 14:20

Но это не то, что ожидается.

Astik Anand 12.06.2018 14:22

@AstikAnand Да ... Он спрашивает, почему его попытка не удалась. Это объяснение неудачи. (Он прокомментировал это теперь удаленное сообщение).

Mathieu 12.06.2018 14:25

Ваша логика не будет работать, потому что нарезка не работает с каждым подсписком в списке. Он будет работать только с внешним списком.

Вместо этого вы можете использовать понимание списка:

new_list = [i[:2] for i in list_of_tuples]

Или, для функционального решения, вы можете использовать operator.itemgetter:

from operator import itemgetter

new_list = list(map(itemgetter(0, 1), list_of_tuples))

print(new_list)

[('11', '12'), ('21', '22'), ('31', '32'), ('41', '42')]

Синтаксис, который вы ищете, похож на индексирование массива NumPy. NumPy - это сторонняя библиотека, которая позволяет индексировать одновременно по нескольким измерениям:

import numpy as  np

arr = np.array(list_of_tuples).astype(int)
res = arr[:, :2]

print(res)

[[11 12]
 [21 22]
 [31 32]
 [41 42]]

Это лучше всего отвечает на вопрос OP, поскольку показывает, что это мышление не совсем неверно, но оно просто не работает с ванильным Python, только с массивами NumPy.

PaulMcG 12.06.2018 14:15

Вы можете просто нарезать кортеж в своем первом списке. Похожий на:

>>> list_of_tuples = [('11','12','13'),('21','22','23'),('31','32','33'),('41','42','43')]
>>> new_list = [item[:2] for item in list_of_tuples]
>>> new_list
[('11', '12'), ('21', '22'), ('31', '32'), ('41', '42')]

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

[(x, y) for x, y, _ in list_of_tuples]

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

[x[:2] for x in list_of_tuples]

Выход:

[('11', '12'), ('21', '22'), ('31', '32'), ('41', '42')]

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

new_list  = list(map(lambda x:x[:2],your_list))

Выполнение итерации в списке для нарезки кортежей определенных элементов:

Синтаксис кода

list =  [('11','12','13'),('21','22','23'),('31','32','33'),('41','42','43')]

new_list = [(a[0],a[1]) for a in list]

Выход

[('11', '12'), ('21', '22'), ('31', '32'), ('41', '42')]

Другие вопросы по теме