अजगर में एक आइटम को छोड़कर सभी *


112

क्या किसी विशेष सूचकांक को छोड़कर किसी सूची के सभी तत्वों (या सरणी, या जो कुछ भी) को अनुक्रमित करने का एक सरल तरीका है ? उदाहरण के लिए,

  • mylist[3] आइटम को स्थिति 3 में लौटाएगा

  • milist[~3] 3 को छोड़कर पूरी सूची वापस कर देंगे

जवाबों:


111

एक के लिए सूची , आप एक सूची कंप्यूटर अनुप्रयोग इस्तेमाल कर सकते हैं। उदाहरण के लिए, 3 तत्व bके aबिना प्रतिलिपि बनाने के लिए :

a = range(10)[::-1]                       # [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
b = [x for i,x in enumerate(a) if i!=3]   # [9, 8, 7, 5, 4, 3, 2, 1, 0]

यह बहुत सामान्य है, और इसका उपयोग सभी पुनरावृत्तियों के साथ किया जा सकता है, जिसमें सुन्न सरणियाँ भी शामिल हैं। यदि आप के []साथ प्रतिस्थापित करते हैं (), तो bएक सूची के बजाय एक पुनरावृत्त होगा।

या आप इसमें इन-प्लेस कर सकते हैं pop:

a = range(10)[::-1]     # a = [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
a.pop(3)                # a = [9, 8, 7, 5, 4, 3, 2, 1, 0]

में numpy आप एक बूलियन अनुक्रमण के साथ ऐसा कर सकता है:

a = np.arange(9, -1, -1)     # a = array([9, 8, 7, 6, 5, 4, 3, 2, 1, 0])
b = a[np.arange(len(a))!=3]  # b = array([9, 8, 7, 5, 4, 3, 2, 1, 0])

जो, सामान्य तौर पर, ऊपर सूचीबद्ध सूची समझ से बहुत तेज होगा।


52
>>> l = range(1,10)
>>> l
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> l[:2] 
[1, 2]
>>> l[3:]
[4, 5, 6, 7, 8, 9]
>>> l[:2] + l[3:]
[1, 2, 4, 5, 6, 7, 8, 9]
>>> 

यह सभी देखें

पायथन के स्लाइस अंकन की व्याख्या करें


2
एक सूची के लिए अच्छा जवाब। आप इसे सरणियों के लिए भी उपयोग कर सकते हैं, लेकिन आपको उपयोग करने की आवश्यकता होगी numpy.concatenate
बाय रीको

48

सबसे सरल तरीका जो मैंने पाया:

mylist[:x]+mylist[x+1:]

कि mylistसूचकांक में तत्व के बिना अपने उत्पादन होगा x


मैंने पाया कि यह वास्तव में आइटम x + 1 को हटा देता है, फिर भी उपयोगी है, धन्यवाद
जैक टीसी

24

यदि आप सुन्न, निकटतम का उपयोग कर रहे हैं, तो मैं सोच सकता हूं कि मास्क का उपयोग कर रहा है

>>> import numpy as np
>>> arr = np.arange(1,10)
>>> mask = np.ones(arr.shape,dtype=bool)
>>> mask[5]=0
>>> arr[mask]
array([1, 2, 3, 4, 5, 7, 8, 9])

itertoolsबिना उपयोग किए भी कुछ ऐसा ही हासिल किया जा सकता हैnumpy

>>> from itertools import compress
>>> arr = range(1,10)
>>> mask = [1]*len(arr)
>>> mask[5]=0
>>> list(compress(arr,mask))
[1, 2, 3, 4, 5, 7, 8, 9]

2
मैं np.arange(len(arr)) != 3मास्क की तरह कुछ का उपयोग कर सकता हूं , क्योंकि तब यह इनलेट हो सकता है, जैसे arr[~(np.arange(len(arr)) == 3)]या जो भी हो।
डीएसएम

@DSM: कृपया इसे एक उत्तर के रूप में पोस्ट करें :-)। किसी भी मामले में, मैं Numpy के साथ काफी बातचीत नहीं कर रहा हूँ।
अभिजीत

एक सरणी को मास्क करने के लिए +1, एक सूची के मामले में मैं स्लाइस के साथ जाऊंगा और संपीड़ित का उपयोग करके खत्म करूंगा।
बाय रीको

5

का उपयोग करें np.delete! यह वास्तव में कुछ भी निष्क्रिय नहीं हटाता है

उदाहरण:

import numpy as np
a = np.array([[1,4],[5,7],[3,1]])                                       

# a: array([[1, 4],
#           [5, 7],
#           [3, 1]])

ind = np.array([0,1])                                                   

# ind: array([0, 1])

# a[ind]: array([[1, 4],
#                [5, 7]])

all_except_index = np.delete(a, ind, axis=0)                                              
# all_except_index: array([[3, 1]])

# a: (still the same): array([[1, 4],
#                             [5, 7],
#                             [3, 1]])

2

मैं इसे करने का एक कार्यात्मक (अपरिवर्तनीय) तरीका प्रदान करने जा रहा हूं।

  1. स्लाइसिंग का उपयोग करने का मानक और आसान तरीका है:

    index_to_remove = 3
    data = [*range(5)]
    new_data = data[:index_to_remove] + data[index_to_remove + 1:]
    
    print(f"data: {data}, new_data: {new_data}")

    आउटपुट:

    data: [0, 1, 2, 3, 4], new_data: [0, 1, 2, 4]
  2. सूची बोध का उपयोग करें:

    data = [*range(5)]
    new_data = [v for i, v in enumerate(data) if i != index_to_remove]
    
    print(f"data: {data}, new_data: {new_data}") 

    आउटपुट:

    data: [0, 1, 2, 3, 4], new_data: [0, 1, 2, 4]
  3. फ़िल्टर फ़ंक्शन का उपयोग करें:

    index_to_remove = 3
    data = [*range(5)]
    new_data = [*filter(lambda i: i != index_to_remove, data)]

    आउटपुट:

    data: [0, 1, 2, 3, 4], new_data: [0, 1, 2, 4]
  4. मास्किंग का उपयोग करना। मास्किंग मानक पुस्तकालय में itertools.compress फ़ंक्शन द्वारा प्रदान की जाती है :

    from itertools import compress
    
    index_to_remove = 3
    data = [*range(5)]
    mask = [1] * len(data)
    mask[index_to_remove] = 0
    new_data = [*compress(data, mask)]
    
    print(f"data: {data}, mask: {mask}, new_data: {new_data}")

    आउटपुट:

    data: [0, 1, 2, 3, 4], mask: [1, 1, 1, 0, 1], new_data: [0, 1, 2, 4]
  5. पायथन मानक पुस्तकालय से itertools.filterfalse फ़ंक्शन का उपयोग करें

    from itertools import filterfalse
    
    index_to_remove = 3
    data = [*range(5)]
    new_data = [*filterfalse(lambda i: i == index_to_remove, data)]
    
    print(f"data: {data}, new_data: {new_data}")

    आउटपुट:

    data: [0, 1, 2, 3, 4], new_data: [0, 1, 2, 4]

0

यदि आप पहले से ही इंडेक्स को नहीं जानते हैं तो एक फ़ंक्शन है जो काम करेगा

def reverse_index(l, index):
    try:
        l.pop(index)
        return l
    except IndexError:
        return False

0

ध्यान दें कि यदि चर सूचियों की सूची है, तो कुछ दृष्टिकोण विफल हो जाएंगे। उदाहरण के लिए:

v1 = [[range(3)] for x in range(4)]
v2 = v1[:3]+v1[4:] # this fails
v2

सामान्य मामले के लिए, का उपयोग करें

removed_index = 1
v1 = [[range(3)] for x in range(4)]
v2 = [x for i,x in enumerate(v1) if x!=removed_index]
v2

0

यदि आप अंतिम या पहले कटौती करना चाहते हैं:

list = ["This", "is", "a", "list"]
listnolast = list[:-1]
listnofirst = list[1:]

यदि आप 1 से 2 बदलते हैं तो पहले 2 अक्षर हटाए जाएंगे, दूसरे नहीं। आशा है कि यह अभी भी मदद करता है!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.