মান দ্বারা কোনও তালিকা উপাদান মুছার সহজ উপায় কি আছে?


942
a = [1, 2, 3, 4]
b = a.index(6)

del a[b]
print(a)

উপরেরটি নিম্নলিখিত ত্রুটিটি দেখায়:

Traceback (most recent call last):
  File "D:\zjm_code\a.py", line 6, in <module>
    b = a.index(6)
ValueError: list.index(x): x not in list

সুতরাং আমি এটি করতে হবে:

a = [1, 2, 3, 4]

try:
    b = a.index(6)
    del a[b]
except:
    pass

print(a)

তবে এটি করার সহজ উপায় কি নেই?


14
আপনি আপনার তালিকার 6 সূচক গণনা করুন। কিন্তু 6 আপনার তালিকায় নেই ... সুতরাং কী হওয়ার কথা? :)
জোহানেস চরারা

5
আপনার কোড ডেল স্টেটমেন্টে না পৌঁছেছে বলে একটি তালিকার কোনও মান মুছে ফেলার সাথে এর কোনও সম্পর্ক নেই। হতে পারে আপনি এটা retitle উচিত "আমি যে একটি তালিকায় না থাকে একটি মানের সূচক পেতে পারি সুস্পষ্ট উত্তর -। তুমি পারবে না।
ডেভ কারবি

57
@ ডেভ ওয়েল, আসলেই নয়। অস্তিত্বশীল আইটেমের জন্য সূচকটি না পাওয়ার জন্য তিনি কোনও আইটেম তালিকা থেকে মুছে ফেলতে চান না কেন তা বিদ্যমান আছে কি নেই। প্রশ্নটি ভাল জিজ্ঞাসা করা হয়।
ইবিজ

পয়েন্ট পাশাপাশি, কিন্তু একটি খালি exceptখারাপ অভ্যাসexcept Exceptionসর্বনিম্ন ব্যবহার করুন ।
wjandrea

উত্তর:


1562

তালিকায় কোনও উপাদানের প্রথম উপস্থিতি সরাতে কেবল ব্যবহার করুন list.remove:

>>> a = ['a', 'b', 'c', 'd']
>>> a.remove('b')
>>> print(a)
['a', 'c', 'd']

মনে রাখবেন এটি আপনার উপাদানটির সমস্ত ঘটনা সরিয়ে দেয় না। তার জন্য একটি তালিকা বোধগম্যতা ব্যবহার করুন।

>>> a = [10, 20, 30, 40, 20, 30, 40, 20, 70, 20]
>>> a = [x for x in a if x != 20]
>>> print(a)
[10, 30, 40, 30, 40, 70]

144
উপাদান তালিকায় না থাকলে ব্যর্থ হয়। :)
ইবিজ

21
@bz তালিকা অনুধাবন উপাদান তালিকায় না থাকলেও এটি ব্যর্থ হয় না, তাই না?
আইজ্যাকস

76
যে কোনও ব্যক্তির স্কিমিংয়ের জন্য স্পষ্ট করার জন্য, এটি "ব্যর্থ" এই অর্থে যে এটি একটি ভ্যালুআরর ব্যতিক্রম উত্থাপন করে।
কেসি ফ্যাল্ক

10
তালিকা অনুধাবন তালিকা রেফারেন্স পরিবর্তন করে তাই কোথাও রেফারেন্সের একটি অনুলিপি থাকলে অপসারণটি অনুসরণ করবে না।
সেবাস্তিয়ান

removeএটি ও (এন) এর জটিলতা কী ?
রাসমি রঞ্জন নায়ক

184

সাধারণত পাইথন একটি ব্যতিক্রম ছুঁড়ে মারবে যদি আপনি এটি এমন কিছু করতে বলেন যা না করতে পারে তবে আপনাকেও করতে হবে:

if c in a:
    a.remove(c)

বা:

try:
    a.remove(c)
except ValueError:
    pass

একটি ব্যতিক্রম অপরিহার্যভাবে কোনও খারাপ জিনিস নয় যতক্ষণ না এটি আপনি আশা করছেন এবং সঠিকভাবে পরিচালনা করছেন।


9
প্রতিরোধ রোগের চিকিত্সার চেয়ে বেশী ভাল। আপনি যদি প্রথমে ব্যতিক্রমী শর্তগুলি পরীক্ষা করতে পারেন (উদাহরণস্বরূপ ক), আপনার উচিত।
গুসডোর

82
অন্য ভাষায় এটি সত্য হলেও পাইথনে এটি "অনুমতি চেয়ে ক্ষমা চাওয়া সহজ।" docs.python.org/2/glossary.html#term-eafp
ডেভ ওয়েব

6
@ গুড্ডর: তালিকাটি থ্রেডগুলির মধ্যে ভাগ করা থাকলে চেক a.remove(c)সত্ত্বেও যাইহোক ব্যর্থ হতে পারে if c in a(চেকের aপরে অন্য থ্রেডে পরিবর্তিত হতে পারে c in aতবে a.remove(c)কল করার আগে )। try/exceptবা লকগুলি জাতির অবস্থা এড়ানোর জন্য ব্যবহার করা যেতে পারে।
jfs

7
@ জেফাসেবাস্টিয়ান যদি থ্রেডগুলির মধ্যে একটি তালিকা ভাগ করা হয় এবং আপনি সমালোচনামূলক বিভাগগুলি প্রয়োগ না করে থাকেন তবে আপনার বড় সমস্যা রয়েছে।
Gusdor

4
@ গুড্ডার, পাইথোনিক আইডিয়মটি পরীক্ষা করে দেখার চেষ্টা করা এবং যদি ব্যতিক্রম ঘটে তবে তা ধরা catch এটি আরও দক্ষ (দুইজনের পরিবর্তে কেবলমাত্র একটি দৃষ্টিভঙ্গি), যদিও কিছুটা কুরুচিপূর্ণ
জিত

80

আপনি করতে পারেন

a=[1,2,3,4]
if 6 in a:
    a.remove(6)

তবে উপরে 2 বার তালিকায় 6 টি অনুসন্ধান করা দরকার, তাই দ্রুত হওয়া ছাড়া চেষ্টা করুন

try:
    a.remove(6)
except:
    pass

55

বিবেচনা:

a = [1,2,2,3,4,5]

সমস্ত ঘটনাগুলি দেখতে, আপনি পাইথনে ফিল্টার ফাংশনটি ব্যবহার করতে পারেন। উদাহরণস্বরূপ, এটি দেখতে লাগবে:

a = list(filter(lambda x: x!= 2, a))

সুতরাং, এটি সমস্ত উপাদান রাখতে হবে a != 2

কেবল আইটেমগুলির মধ্যে একটি ব্যবহার করতে

a.remove(2)

কেন আপনি filter()অন্য একটি জড়ান list()? ম্যানুয়াল অনুসারে, এটি ইতিমধ্যে একটি তালিকা ফেরত দেয়।
ওলাফ ডিয়েটেস

8
পাইথন ৩.x এ @ ওলাফডিটসে, এটি একটি ফিল্টার অবজেক্ট ফেরত দেয় (২.x এ এটি একটি তালিকা ফেরত দেয়), সুতরাং এর কোনও কার্যকারিতা থাকার জন্য আমাকে একটি তালিকাতে "ক" দিতে হবে।
ম্যাথউইজুর্ড

17

এটি কীভাবে অন্তর্ভুক্ত করবেন (তালিকাটি বোঝার ছাড়াই):

def remove_all(seq, value):
    pos = 0
    for item in seq:
        if item != value:
           seq[pos] = item
           pos += 1
    del seq[pos:]

খুব চালাক - আমি সত্যিই এটি পছন্দ করি - দুর্ভাগ্যক্রমে এটি সর্বাধিক জনপ্রিয় উত্তরের মতো অদক্ষ বলে মনে হচ্ছে। গিলের দ্রবণটি দৈত্য তালিকাগুলির জন্য আপনি যে মানটি মুছতে চান তার কেবলমাত্র কয়েকটি সংঘটন সহ অনেক দ্রুত।
লারোল্ড

1
@ লারোল্ড দ্রুততম উপায়টি একটি পৃথক প্রশ্ন হবে। আমার অর্থ সাধারণ ক্ষেত্রে তালিকা বোধগম্য। যদি ইনপুট তালিকায় মানটি ঘন ঘন হয় এবং তালিকান বোঝাপড়াটি ব্যবহার না করা হয় তবে এই সমাধানটি সত্যিই ভাল সম্পাদন করা উচিত। সাইথনে পাইপি, ন্যালি ডেটা চেষ্টা করে দেখুন। [@ গিলের উত্তর O(n*n)অহেতুক (1e6 এবং 1e12 এর সাথে তুলনা করুন - আপনি পরবর্তীটির ঝুঁকি নিতে চান না)। while 1: L.remove(value)এবং সিপিথনে ValueErrorকয়েকটি valueগুলি বা ছোট তালিকার সাথে ভালভাবে ফিরে আসতে পারে return
jfs

13

কোন মানটি মুছতে হবে তা যদি আপনি জানেন তবে এখানে একটি সহজ উপায় (যতই সহজভাবে আমি ভাবতে পারি):

a = [0, 1, 1, 0, 1, 2, 1, 3, 1, 4]
while a.count(1) > 0:
    a.remove(1)

তুমি পাবে [0, 0, 2, 3, 4]


4
while 1 in a:লুপ স্ট্রাকচার হিসাবে ব্যবহার করবেন না কেন ?
টার্মিনালডিলেটান্ত

12
এই O(n^2)যেখানে একটি ধী হবে O(n)
ম্যাড পদার্থবিদ

1
অবশ্যই @ ম্যাডফিসিসিস্ট সঠিক, এবং টার্মিনাল ডিলিট্যান্টের সংস্করণটি অনেক বেশি পাইথোনিক, এমনকি যদি আমরা পারফরম্যান্সের বিষয়ে চিন্তা না করি। 2013 সালে আমি কেবল পাইথন শিখতে শুরু করেছি এবং আজকাল আমি প্রায়শই লজ্জা পেয়েছিলাম তখন আমি যা লিখেছিলাম তা নিয়ে।
গিল

11

আরেকটি সম্ভাবনা হ'ল তালিকার পরিবর্তে একটি সেট ব্যবহার করা, যদি আপনার অ্যাপ্লিকেশনটিতে কোনও সেট প্রযোজ্য হয়।

IE যদি আপনার ডেটা অর্ডার না করা হয় এবং তার নকল না থাকে তবে

my_set=set([3,4,2])
my_set.discard(1)

ত্রুটি মুক্ত।

প্রায়শই তালিকাগুলি কেবল আনর্ডারড থাকা আইটেমগুলির জন্য কেবল একটি কার্যকর পাত্রে থাকে। কোনও তালিকা থেকে কোনও উপাদানের সমস্ত উপস্থিতি কীভাবে সরিয়ে নেওয়া যায় সে সম্পর্কে প্রশ্ন রয়েছে। আপনি যদি প্রথম জায়গায় দুপস না চান তবে আবার একটি সেট হস্তান্তরিত।

my_set.add(3)

উপরে থেকে আমার_সেট পরিবর্তন করে না।


10

অন্যান্য অসংখ্য উত্তর দ্বারা বর্ণিত হিসাবে, list.remove()কাজ করবে, তবে ValueErrorআইটেমটি তালিকায় না থাকলে একটি নিক্ষেপ করুন। অজগর 3.4+ সহ, দমন প্রসঙ্গে ব্যবহার করে এটি পরিচালনা করার জন্য একটি আকর্ষণীয় পন্থা রয়েছে :

from contextlib import suppress
with suppress(ValueError):
    a.remove('b')

8

একটি তালিকাতে একটি মান সন্ধান করা এবং তারপরে সেই সূচকটি মুছে ফেলা (যদি এটি বিদ্যমান থাকে) কেবল তালিকার অপসারণ পদ্ধতিটি ব্যবহার করে আরও সহজ করা যায়:

>>> a = [1, 2, 3, 4]
>>> try:
...   a.remove(6)
... except ValueError:
...   pass
... 
>>> print a
[1, 2, 3, 4]
>>> try:
...   a.remove(3)
... except ValueError:
...   pass
... 
>>> print a
[1, 2, 4]

আপনি যদি প্রায়শই এটি করেন তবে আপনি এটি কোনও ফাংশনে গুটিয়ে রাখতে পারেন:

def remove_if_exists(L, value):
  try:
    L.remove(value)
  except ValueError:
    pass

8

এই উদাহরণটি দ্রুত এবং তালিকা থেকে একটি মানের সমস্ত উদাহরণ মুছে ফেলবে:

a = [1,2,3,1,2,3,4]
while True:
    try:
        a.remove(3)
    except:
        break
print a
>>> [1, 2, 1, 2, 4]

2
আপনি যদি এটি করেন তবে আপনার কেবলমাত্র breakচালু হওয়া উচিত except ValueError
অ্যান্থন


7

যদি আপনার উপাদানগুলি পৃথক হয়, তবে একটি সাধারণ সেট পার্থক্য করতে পারে।

c = [1,2,3,4,'x',8,6,7,'x',9,'x']
z = list(set(c) - set(['x']))
print z
[1, 2, 3, 4, 6, 7, 8, 9]

2
যদি আপনার উপাদানগুলি পৃথক হয় এবং আপনি অর্ডার সম্পর্কে চিন্তা করেন না
টম জাইচ

2

আমরা .pop ব্যবহার করতে পারি:

>>> lst = [23,34,54,45]
>>> remove_element = 23
>>> if remove_element in lst:
...     lst.pop(lst.index(remove_element))
... 
23
>>> lst
[34, 54, 45]
>>> 

2

আপনি মুছে ফেলতে ইচ্ছুক উপাদানগুলি বাদে সবকিছুকে সূচক করে তালিকাটি ওভাররাইট করুন

>>> s = [5,4,3,2,1]
>>> s[0:2] + s[3:]
[5, 4, 2, 1]

2

লুপ এবং শর্তের জন্য:

def cleaner(seq, value):    
    temp = []                      
    for number in seq:
        if number != value:
            temp.append(number)
    return temp

এবং যদি আপনি কিছু মুছতে চান তবে সমস্তটি নয়:

def cleaner(seq, value, occ):
    temp = []
    for number in seq:
        if number == value and occ:
            occ -= 1
            continue
        else:
            temp.append(number)
    return temp


1

উদাহরণস্বরূপ বলুন, আমরা x থেকে সমস্ত 1 টি সরাতে চাই। এইভাবে আমি এটি সম্পর্কে যাব:

x = [1, 2, 3, 1, 2, 3]

এখন, এটি আমার পদ্ধতির ব্যবহারিক ব্যবহার:

def Function(List, Unwanted):
    [List.remove(Unwanted) for Item in range(List.count(Unwanted))]
    return List
x = Function(x, 1)
print(x)

এবং এটি একক লাইনে আমার পদ্ধতি:

[x.remove(1) for Item in range(x.count(1))]
print(x)

উভয়ই আউটপুট হিসাবে এটি উত্পাদন করে:

[2, 3, 2, 3, 2, 3]

আশাকরি এটা সাহায্য করবে. পিএস, অনুরোধ করুন যে এটি 3..6.২ সংস্করণে লেখা হয়েছিল, সুতরাং আপনার এটি পুরানো সংস্করণগুলির জন্য সামঞ্জস্য করতে হতে পারে।


1

হতে পারে আপনার সমাধানগুলি ইনটগুলির সাথে কাজ করে, তবে এটি অভিধানের সাহায্যে আমার পক্ষে কাজ করে না।

একদিকে মুছে ফেলুন () আমার পক্ষে কাজ করে নি। তবে এটি বেসিক প্রকারের সাথে কাজ করে। আমার ধারণা, কোড বেলোও বস্তুর তালিকা থেকে আইটেমগুলি সরিয়ে ফেলার উপায়।

অন্যদিকে, 'ডেল'ও ঠিক মতো কাজ করেনি। আমার ক্ষেত্রে, পাইথন ৩. using ব্যবহার করে: যখন আমি 'বকল' দিয়ে 'ডেল' কমান্ডের একটি তালিকা থেকে কোনও উপাদান মুছতে চেষ্টা করি, তখন পাইথন প্রক্রিয়াটির সূচকটি পরিবর্তন করে এবং বালতি সময়ের আগেই থেমে যায়। এটি কেবল তখনই কাজ করে যদি আপনি বিপরীত ক্রমে উপাদান দ্বারা উপাদানটিকে মুছুন । এইভাবে আপনি মুলতুবি থাকা উপাদানগুলির অ্যারে সূচকটি পরিবর্তন করবেন না

তারপরে, আমি ব্যবহার করেছি:

c = len(list)-1
for element in (reversed(list)):
    if condition(element):
        del list[c]
    c -= 1
print(list)

যেখানে 'তালিকা' এর মতো [key 'কী 1': মান 1 '}, {' কী 2 ': মান 2}, {' কী 3 ': মান 3}, ...]

এছাড়াও আপনি গণনা ব্যবহার করে আরও অজগর করতে পারেন:

for i, element in enumerate(reversed(list)):
    if condition(element):
        del list[(i+1)*-1]
print(list)

0
arr = [1, 1, 3, 4, 5, 2, 4, 3]

# to remove first occurence of that element, suppose 3 in this example
arr.remove(3)

# to remove all occurences of that element, again suppose 3
# use something called list comprehension
new_arr = [element for element in arr if element!=3]

# if you want to delete a position use "pop" function, suppose 
# position 4 
# the pop function also returns a value
removed_element = arr.pop(4)

# u can also use "del" to delete a position
del arr[4]

0

এটি "-v"অ্যারে থেকে সমস্ত দৃষ্টান্ত সরিয়ে দেয় sys.argvএবং কোনও উদাহরণ না পাওয়া গেলে অভিযোগ করে না:

while "-v" in sys.argv:
    sys.argv.remove('-v')

আপনি কোডটি ক্রিয়াকলাপে, একটি ফাইলটিতে দেখতে পারেন speechToText.py:

$ python speechToText.py -v
['speechToText.py']

$ python speechToText.py -x
['speechToText.py', '-x']

$ python speechToText.py -v -v
['speechToText.py']

$ python speechToText.py -v -v -x
['speechToText.py', '-x']

-1

এটি আমার উত্তর, কেবল যখন এবং জন্য ব্যবহার করুন

def remove_all(data, value):
    i = j = 0
    while j < len(data):
        if data[j] == value:
            j += 1
            continue
        data[i] = data[j]
        i += 1
        j += 1
    for x in range(j - i):
        data.pop()
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.