Предположим, у вас есть такой 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], но для этого требуется значительно больше кода, и я также считал свой исходный подход питоническим.
[:] возвращает весь список, из которого вы вырезаете первые 2 элемента
print [(a [0], a [1]) для входящего списка] попробуйте это






Первая попытка делает это:
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 элемента.
@AstikAnand Он просит объяснений. У него уже есть решение с пониманием списка.
Но это не то, что ожидается.
@AstikAnand Да ... Он спрашивает, почему его попытка не удалась. Это объяснение неудачи. (Он прокомментировал это теперь удаленное сообщение).
Ваша логика не будет работать, потому что нарезка не работает с каждым подсписком в списке. Он будет работать только с внешним списком.
Вместо этого вы можете использовать понимание списка:
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.
Вы можете просто нарезать кортеж в своем первом списке. Похожий на:
>>> 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')]
lst[:]нарезает список, но без указания индексов, по сути, вы просто делаете копию списка - так чтоlist_of_tuples[:][0:2]похож наlist_of_tuples[:2]- и должно быть ясно, почему это не работает так, как вы ожидаете.