2013-08-16 5 views
112

जानने के लिए सूची के कई तत्वों तक पहुंचें, मुझे उनकी अनुक्रमणिका जानने के लिए दी गई सूची से कुछ तत्व चुनने की आवश्यकता है। मान लें कि मैं एक नई सूची बनाना चाहता हूं, जिसमें दिए गए सूची [2, 1, 5, 3, 8, 5, 6] से इंडेक्स 1, 2, 5 के साथ तत्व शामिल है। मैंने क्या किया:अपनी अनुक्रमणिका

a = [-2,1,5,3,8,5,6] 
b = [1,2,5] 
c = [ a[i] for i in b] 

क्या ऐसा करने का कोई बेहतर तरीका है? सी = ए [बी] की तरह कुछ?

+0

वैसे, मैं एक और समाधान यहां पाया । मैंने अभी तक इसका परीक्षण नहीं किया है, लेकिन मुझे लगता है कि http://code.activestate.com/recipes/577953-get-multiple-elements-from-a-list/ –

+0

में रुचि रखने के बाद मैं इसे यहां पोस्ट कर सकता हूं प्रश्न में उल्लिखित वही समाधान, लेकिन 'लैम्ब्डा' समारोह में लपेटा गया। –

+0

संभावित डुप्लिकेट [पायथन में किसी सूची से तत्व निकालने के लिए कैसे?] (Https://stackoverflow.com/questions/2621674/how-to-extract-elements-from-a-list-in-python) – jdhao

उत्तर

113

आप operator.itemgetter उपयोग कर सकते हैं:

from operator import itemgetter 
a = [-2, 1, 5, 3, 8, 5, 6] 
b = [1, 2, 5] 
print itemgetter(*b)(a) 
# Result: 
(1, 5, 5) 

या आप उपयोग कर सकते हैं numpy:

import numpy as np 
a = np.array([-2, 1, 5, 3, 8, 5, 6]) 
b = [1, 2, 5] 
print list(a[b]) 
# Result: 
[1, 5, 5] 

लेकिन वास्तव में, आपका वर्तमान समाधान ठीक है। यह शायद उन सभी में से सबसे अच्छा है।

+14

+1 उल्लेख करने के लिए कि 'सी = [ए [i] मैं बी में]] पूरी तरह से ठीक है। ध्यान दें कि 'itemgetter' समाधान एक ही चीज़ नहीं करेगा यदि बी में 2 से कम तत्व हैं। – flornquake

+0

** साइड ** ** नोट **: बहु-प्रक्रिया में काम करते समय _itemgetter_ का उपयोग करना काम नहीं करता है। बहु-प्रक्रिया में बेवकूफ काम करता है। –

+0

अतिरिक्त टिप्पणी, 'एक [बी] 'काम करता है ** केवल ** जब' a' एक ** numpy ** सरणी है, यानी आप इसे एक numpy फ़ंक्शन के साथ बनाते हैं। –

22

विकल्प:

>>> map(a.__getitem__, b) 
[1, 5, 5] 

>>> import operator 
>>> operator.itemgetter(*b)(a) 
(1, 5, 5) 
0

मेरा उत्तर numpy या python संग्रह का उपयोग नहीं करता है। तत्वों के रूप में निम्नानुसार होगा खोजने के लिए

एक तुच्छ तरीका:

a = [-2, 1, 5, 3, 8, 5, 6] 
b = [1, 2, 5] 
c = [i for i in a if i in b] 

वापसी: इस विधि बड़ा सूचियों के लिए काम न करें। बड़ी सूची के लिए numpy का उपयोग करने की सिफारिश की है।

+3

का उपयोग करके, वांछित इंडेक्स को केवल ब्रांड्स के अंदर वांछित इंडेक्स टाइप करने से थोड़ा तेज, प्रतीत होता है, 'ए' को फिर से चलाने की आवश्यकता नहीं है। '[ए [i] मैं बी में]' – falsetru

+0

यह विधि किसी भी अन्य मामले में भी काम नहीं करती है। क्या होगा यदि 'ए' में 5 और था? – TerryA

+0

आईएमओ, [सेट] (https://docs.python.org/3/tutorial/datastructures.html#sets) का उपयोग करके इस तरह के छेड़छाड़ करने के लिए तेज़ी से – sirgogo

3

बेसिक और न बहुत व्यापक परीक्षण पाँच आपूर्ति जवाब के निष्पादन के समय की तुलना:

def numpyIndexValues(a, b): 
    na = np.array(a) 
    nb = np.array(b) 
    out = list(na[nb]) 
    return out 

def mapIndexValues(a, b): 
    out = map(a.__getitem__, b) 
    return list(out) 

def getIndexValues(a, b): 
    out = operator.itemgetter(*b)(a) 
    return out 

def pythonLoopOverlap(a, b): 
    c = [ a[i] for i in b] 
    return c 

multipleListItemValues = lambda searchList, ind: [searchList[i] for i in ind] 

निम्नलिखित इनपुट का उपयोग:

a = range(0, 10000000) 
b = range(500, 500000) 

सरल अजगर पाश था लैम्ब्डा आपरेशन एक साथ तेज करीबी दूसरा, mapIndexValues ​​और getIndexValues ​​सूक्ष्म विधि में सूक्ष्म सरणी में कनवर्ट करने के बाद काफी धीमी संख्या के साथ काफी समान थे। अगर डेटा पहले से ही numpy arrays में numpyIndexValues ​​विधि numpy के साथ है .array रूपांतरण हटा दिया गया है सबसे तेज है।

numpyIndexValues -> time:1.38940598 (when converted the lists to numpy arrays) 
numpyIndexValues -> time:0.0193445 (using numpy array instead of python list as input, and conversion code removed) 
mapIndexValues -> time:0.06477512099999999 
getIndexValues -> time:0.06391049500000001 
multipleListItemValues -> time:0.043773591 
pythonLoopOverlap -> time:0.043021754999999995 
+0

मुझे नहीं पता कि आप किस पायथन दुभाषिया का उपयोग करते हैं लेकिन पहली विधि ' numpyIndexValues' 'a' के बाद से काम नहीं करता है,' b' प्रकार 'श्रेणी' के हैं। मैं अनुमान लगा रहा हूं कि आप 'a',' b' को 'numpy.ndarrays' में परिवर्तित करने के लिए पहले उल्लेख करते हैं? – strpeter

+0

@स्ट्रिपेटर हाँ मैं सेब के साथ सेब की तुलना नहीं कर रहा था, मैंने numpyIndexValues ​​के लिए टेस्ट केस में इनपुट के रूप में numpy arrays बनाया था। मैंने इसे अभी तय कर लिया है और सभी इनपुट के समान सूचियों का उपयोग करते हैं। –

2

मुझे यकीन है कि यह पहले से ही माना गया है कर रहा हूँ:

c = [a[b[0]]] + [a[b[1]]] + [a[b[2]]] 

या यहां तक ​​कि सूचकांक अगर सरल: ख में सूचकांक की राशि छोटे और स्थिर है, तो एक जैसे परिणाम लिख सकता है स्वयं स्थिरांक हैं ...

c = [a[1]] + [a[2]] + [a[5]] 

या यदि सूचकांक की लगातार श्रृंखला है ...

c = a[1:3] + [a[5]] 
+0

मुझे याद दिलाने के लिए धन्यवाद कि '[ए] + [बी] = [ए, बी] ' – onewhaleid

1

एक अन्य समाधान पांडा श्रृंखला के माध्यम से हो सकता है:

import pandas as pd 

a = pd.Series([-2, 1, 5, 3, 8, 5, 6]) 
b = [1, 2, 5] 
c = a[b] 

फिर आप ग वापस एक सूची अगर आप चाहते हैं करने के लिए परिवर्तित कर सकते हैं:

c = list(c) 
संबंधित मुद्दे