Көп айнымалылармен 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, көзі
Рахмет! Менің ойымша, бұл жерде бізде typo бар болатын сезім болды
қосылды автор ImmortalxR, көзі
str.join() - тізімдерге тізімдерге қосылу үшін пайдалануға болады: '\ n'.join ([', ', join (i) for i for multiple_index)) сыртқы тізімдерге жаңа жолдармен, ішкі тізімдерді үтір арқылы қосатын бір жол үшін.
қосылды автор Martijn Pieters, көзі
@ImmortalxR: Мен кездейсоқ толығымен тоқтаған жерде үтірді тердім. Сондай-ақ, сіз толық кодты енгізуіңізге ие боласыз, сондықтан сіз алдымен str дегенге сілтеме жасауыңыз керек: '\ n'.join ([', ',' join (map (str, 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)

Әрине, егер numpy пайдалансаңыз, келесідей нәрсені жасай аласыз:

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.r _ , 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)

әрбір тізімнің getitem функциясы арқылы қажетті индекстерді салыстыруға болады. Бұл әр тізім үшін осы индекстердегі элементтерді қамтитын тізімді қайтарады. Мысал кодын өзгерту:

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]

бұл қажетті өнім шығарады.

python сиқырлы әдістері туралы көбірек білу үшін this бөлімін қараңыз:

0
қосылды