Слайты кортежей в списке (питон) - PullRequest
0 голосов
/ 12 июня 2018

Предположим, у вас есть 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], но для этого требуется значительно больше кода, и я подумалМой оригинальный подход также питон.

Ответы [ 6 ]

0 голосов
/ 12 июня 2018

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

print [(a [0], a [1]) для списка в списке]

вы будетеполучить o / p как

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

0 голосов
/ 12 июня 2018

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

new_list  = list(map(lambda x:x[:2],your_list))
0 голосов
/ 12 июня 2018

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

[(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')]
0 голосов
/ 12 июня 2018

Вы можете просто нарезать кортеж в своем первом списке.Аналогично:

>>> 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')]
0 голосов
/ 12 июня 2018

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

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

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]]
0 голосов
/ 12 июня 2018

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

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

РЕДАКТИРОВАТЬ: И если вы положите несколько [:], вы просто "копируете" несколько раз исходный список, поэтому не имеет значения, сколько из этого вы помещаете ...

...