2013-08-26 10 views
9

यह कुछ अन्य प्रश्न (Explicitly select items from a Python list or tuple, Grabbing specific indices of a list in Python) के समान है, लेकिन मैं विपरीत करने के लिए देख रहा हूँ:अजगर अनुक्रमण बहिष्कृत

क्या की एक सूची/टपल निर्दिष्ट करने के लिए एक साफ रास्ता है पर सूचकांक को चुनने के बजाय, बाहर निकलें? मैं बाहर करने के लिए आर या MATLAB जहां सूचकांक निर्दिष्ट कर सकते हैं करने के लिए कुछ इसी तरह की सोच रहा हूँ, जैसे:

vector1 <- c('a', 'b', 'c', 'd') 
vector2 <- vector1[-1] # ['b', 'c', 'd'] 
vector3 <- vector1[c(-1, -2)] # ['c', 'd'] 

वहाँ एक अच्छा तरीका है पायथन में इसी कार्य को पूरा करने के लिए है? क्षमा करें अगर यह एक डुप्ली है, तो मुझे यकीन नहीं था कि वास्तव में क्या खोजना है।

उत्तर

10
>>> to_exclude = {1, 2} 
>>> vector = ['a', 'b', 'c', 'd'] 
>>> vector2 = [element for i, element in enumerate(vector) if i not in to_exclude] 

यहाँ चाल हैं:

  • दूसरे में एक सूची को बदलने के लिए एक सूची समझ का प्रयोग करें। (आप filter फ़ंक्शन का भी उपयोग कर सकते हैं, विशेष रूप से यदि आप जिस फ़िल्टर को फ़िल्टर कर रहे हैं वह पहले से ही एक अच्छा नाम वाला फ़ंक्शन के रूप में झूठ बोल रहा है।)
  • प्रत्येक तत्व और इसकी अनुक्रमणिका को एक साथ प्राप्त करने के लिए enumerate का उपयोग करें।
  • किसी भी Set या Sequence * के विरुद्ध in ऑपरेटर का उपयोग करें, यह निर्धारित करने के लिए कि कौन से फ़िल्टर फ़िल्टर करें। (set बहुत अधिक मूल्यवान हैं, और संभवतः अवधारणात्मक रूप से सही उत्तर है ... लेकिन यह वास्तव में केवल कुछ मुट्ठी भर के लिए बहुत मायने रखता नहीं है; यदि आपके पास पहले से ही एक सूची है या इसमें 4 इंडेक्स हैं, कि एक "Set या Sequence" भी है, तो आप बस इसे उपयोग कर सकते हैं।)

* तकनीकी तौर पर, किसी भी Container करेंगे। लेकिन एस जो Set या Sequence नहीं हैं, यहां मूर्ख होंगे।

+0

आहा, ज़ाहिर है। विस्तृत स्पष्टीकरण के लिए धन्यवाद (जब मैं मुझे देता हूं तो मैं इसे स्वीकार करूंगा)। –

3

उपयोग enumerate() और आप निकालना चाहते हैं किसी भी सूचकांक को बाहर:

[elem for i, elem in enumerate(inputlist) if i not in excluded_indices] 

प्रदर्शन के लिए, यह सबसे तेजी से करता है, तो excluded_indices एक set था होगी।

+0

'set' वास्तव में' list' तुलना में तेजी से नहीं होगा जब तक वहाँ कुछ तत्वों की तुलना में अधिक (पिछले सवाल से कर रहे हैं, आपके कार्यान्वयन के आधार पर कटऑफ तारों के साथ 3 और 12 के बीच कहीं भी है)। लेकिन अवधारणात्मक रूप से यह वैसे भी अधिक समझ में आता है। – abarnert

+0

@abarnert: क्या यह इनपुट सूची में तत्वों की संख्या पर भी निर्भर नहीं है? और इस फ़िल्टर के लिए, यदि 'exted_indices' को सॉर्ट या यादृच्छिक रूप से भी किया गया है तो इससे कोई फर्क पड़ सकता है; मैं थोड़ा संदिग्ध हूं कि कटऑफ हर जगह * करीब * 12 है; सेट लुकअप (हैश गणना और लुकअप, मुख्य रूप से) की निश्चित लागत वास्तव में उच्च है? –

+0

जो मैं अस्पष्ट रूप से याद करता हूं, पाइथन 2 में बहुत बड़ी 'यूनिकोड' ऑब्जेक्ट्स के साथ।7, मुझे 6 और 7 के बीच कटऑफ के साथ एक मामला मिला ... लेकिन किसी और को एक मामला मिला जो लगभग दो गुना अधिक था, संभवतः एक अलग पायथन कार्यान्वयन में। बेशक "तारों के साथ" ध्यान दें; हैशिंग इनट्स बहुत तेज़, यहां तक ​​कि बड़ी चींटियां हैं, इसलिए मुझे उम्मीद है कि यह लगभग 2-3 सबसे खराब हो जाएगा ... और मुझे यकीन नहीं है कि सॉर्टिंग कैसे अंतर करेगी (जब तक कि आप 'bisect' का उपयोग करके तीसरा कार्यान्वयन नहीं चाहते हैं) एक पेड़ या कुछ)। – abarnert

7
import numpy 
target_list = numpy.array(['1','b','c','d','e','f','g','h','i','j']) 
to_exclude = [1,4,5] 
print target_list[~numpy.in1d(range(len(target_list)),to_exclude)] 

क्योंकि numpy मज़ा

+1

प्लस, यदि आप MATLAB कोड को पायथन में अनुवाद कर रहे हैं, तो संभवतः आप मूल सूचियों और loops के बजाय numsh को देख रहे हैं ... – abarnert

0

है मैं एक अलग दृष्टिकोण ले itemgetter का उपयोग कर देंगे। बस के लिए इसके बारे में मज़ा :)

from operator import itemgetter 

def exclude(to_exclude, vector): 
    "Exclude items with particular indices from a vector." 
    to_keep = set(range(len(vector))) - set(to_exclude) 
    return itemgetter(*to_keep)(vector) 
1

उपयोग np.delete

In [38]: a 
Out[38]: array([ 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]) 

In [39]: b 
Out[39]: [3, 4, 5, 9] 

In [40]: a[b] 
Out[40]: array([ 7, 8, 9, 13]) 

In [41]: np.delete(a, b) 
Out[41]: array([ 4, 5, 6, 10, 11, 12]) 
संबंधित मुद्दे