Сприйняття списку Python з кількома змінними

Я намагаюся отримати список з певним виходом з індексу в іншому списку наприклад:

L = [(0, 1, 2, 3, 4, 5), (6, 7, 8, 9, 10,...etc), (...etc)]
multiple_index = [entry[0, 3, 4] for entry in L] 
#----> I know this specific code is wrong

Я б дуже хотів, щоб виведений код міг:

[(0, 3, 4), (6, 9, 10), (...etc)]

Я хочу, щоб окремі субіндекси з кожного індексу в основному списку були згруповані, як показано, якщо це взагалі можливо, і я задаюсь питанням, який код я міг би використовувати, щоб належним чином зняти це, дякую.

EDIT: Крім того, як я можу форматувати його для відображення як рядків чисто, я виводять їх у текстовий файл, використовуючи .writelines та окремий вихідний рядок, завдяки ще раз!

3
Цікаво, вибачте, я не міг знайти відповідь на оригінальне питання в іншому місці, і редагування просто просити про додаткову допомогу, це все.
додано Автор ImmortalxR, джерело
Ваша редакція робить це ще одним питанням, у якому вже є багато відповідей на SO.
додано Автор Jon Clements, джерело

7 Відповіді

Використовуйте operator.itemgetter() :

from operator import itemgetter

multiple_index = map(itemgetter(0, 3, 4), L)

або в розумінні списку:

multiple_index = [itemgetter(0, 3, 4)(i) for i in L]
8
додано
Це чудово працює, як короткий огляд, якщо ви можете відповісти на це, як я можу отримати multiple_index для відображення результату в окремих рядках, я відредагував оригінальний пост з новим форматом :)
додано Автор ImmortalxR, джерело
Це призводить до неправильної синтаксичної помилки при застосуванні наведеного вище коду? Будь-яка ідея чому?
додано Автор ImmortalxR, джерело
Дякую! Я мав відчуття, що ми могли б мати помилку там, ха-ха
додано Автор ImmortalxR, джерело
Ви можете використовувати str.join() для об'єднання списків у рядки: '\ n'.join ([', ', join (i) для i в multi_index)) для однієї рядки, що входять до зовнішніх списків новими рядками, внутрішні списки комами.
додано Автор Martijn Pieters, джерело
@ImmortalxR: Оскільки я випадково ввів кому, де йде повна зупинка. У вас також є цілі значення, тому вам слід спочатку впорядкувати str : '\ n'.join ([', '. Join (map (str, i)) для i in multiple_index])
додано Автор Martijn Pieters, джерело

Ось один варіант:

L = [(0, 1, 2, 3, 4, 5), (6, 7, 8, 9, 10, 11), (11, 12, 13, 14, 15, 16)]
multiple_index = [(entry[0], entry[3], entry[4]) for entry in L] 

Або за допомогою operator.itemgetter() :

from operator import itemgetter
indices = itemgetter(0, 3, 4)
multiple_index = [indices(entry) for entry in L] 
3
додано
Yup - operator.itemgetter це те, що я хотів би ...
додано Автор Jon Clements, джерело
from operator import itemgetter
get = itemgetter(0, 3, 4)
L = [(0, 1, 2, 3, 4, 5), (6, 7, 8, 9, 10,...etc), (...etc)]
multiple_index = [get(entry) for entry in L]

для більш функціонального стилю:

multiple_index = map(itemgetter(0, 3, 4), L)

Звичайно, якщо ви використовуєте номер, ви можете зробити щось подібне:

import numpy as np
L = np.array([(0, 1, 2, 3, 4, 5), (6, 7, 8, 9, 10, 11), (11, 12, 13, 14, 15, 16)])
multiple_index = L[:,(0, 3, 4)]

в результаті чого:

array([[ 0,  3,  4],
       [ 6,  9, 10],
       [11, 14, 15]])

Personally, I like the numpy version the best, but that requires you to have numpy installed. Here's some more on numpy indexing if you're interested: http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html

Numpy також має деякі привабливі ярлики/хитрощі для фешенебельного фрагмента та діапазону, використовуючи np.s _ , np.r _ і np.c _ .

2
додано

Ви зацікавлені в цьому?

L = [(0, 1, 2, 3, 4, 5), (6, 7, 8, 9, 10,...etc), (...etc)]
multiple_index = [(entry[0], entry[3], entry[4]) for entry in L] 
#----> I know this specific code is wrong
2
додано

Просто для деякого розмаїття, ось так: itertools.compress

>>> from itertools import compress, count
>>> indices = {0,3,4}
>>> items_at = lambda indices: (1 if n in indices else 0 for n in count())
>>> [tuple(compress(e, items_at(indices))) for e in L]
[(0, 3, 4), (6, 9, 10)]
2
додано

Ось як я це зробив би:

    L=[tuple(range(0,6*1)),tuple(range(6*1,6*2)),tuple(range(6*2,6*3))]
    print [tuple(map(lambda i: entry[i],[0,3,4])) for entry in L]
0
додано

Список кортежу та диктуючого пошуку здійснюються за допомогою їхніх методів getitem

myarray=[0,1,2]
print myarray[1]
#result:1
#equivalent to
print myarray.__getitem__(1)

ви можете відобразити потрібні показники за допомогою функції геотети у кожному списку. Це повертає список, що містить елементи за цими показниками для кожного списку. Змінення вашого прикладу коду:

L = [(0, 1, 2, 3, 4, 5), (6, 7, 8, 9, 10,...etc), (...etc)]
multiple_index = [map(entry.__getitem__,[0, 3, 4]) for entry in L]

це дає бажаний результат.

Для отримання додаткових відомостей про магічні методи пітона див. цю :

0
додано
ІТ КПІ - Python
ІТ КПІ - Python
625 учасників

Канал обговорень про всякі штуки зі світу пайтону. Прохання: 0. мати повагу одне до одного; 1. не матюкатися в сторону людей; 2. не захламляти тред повідомленнями по одному слову;