পাইথনের এক আইটেম ব্যতীত সমস্ত * সূচক


112

কোনও নির্দিষ্ট সূচক বাদে কোনও তালিকার সমস্ত উপাদানকে (বা অ্যারে, বা যাই হোক না কেন) সূচক করার সহজ উপায় আছে ? যেমন,

  • mylist[3] আইটেমটি 3 অবস্থানে ফিরে আসবে

  • milist[~3] 3 বাদে পুরো তালিকাটি ফিরিয়ে দেবে

উত্তর:


111

একটি তালিকার জন্য , আপনি একটি তালিকা কমপ ব্যবহার করতে পারেন। উদাহরণস্বরূপ, তৃতীয় উপাদান ব্যতীত 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

@ ডিএসএম: দয়া করে একটি উত্তর হিসাবে পোস্ট করুন :-)। যাই হোক, আমি নিম্পির সাথে বেশ কথোপকথনকারী নই।
অভিজিৎ

অ্যারে মাস্কিংয়ের জন্য +1, একটি তালিকার ক্ষেত্রে আমি টুকরো টুকরো করে যেতে চাই এবং সংক্ষেপে কমপ্রেটেট ব্যবহার করতাম।
দ্বি রিকো

4

ব্যবহার করুন 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 টি অক্ষর দ্বিতীয়টি বাদ দেওয়া হবে না। আশা করি এটি এখনও সহায়তা করে!

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.