जवाबों:
कार्यात्मक दृष्टिकोण:
अजगर 3.x
>>> x = [1,2,3,2,2,2,3,4]
>>> list(filter((2).__ne__, x))
[1, 3, 3, 4]
या
>>> x = [1,2,3,2,2,2,3,4]
>>> list(filter(lambda a: a != 2, x))
[1, 3, 3, 4]
अजगर 2.x
>>> x = [1,2,3,2,2,2,3,4]
>>> filter(lambda a: a != 2, x)
[1, 3, 3, 4]
[y for y in x if y != 2]
__ne__
। दो मूल्यों की तुलना सिर्फ कॉल करने __eq__
या __ne__
उनमें से किसी एक पर अधिक जटिल प्रक्रिया है । यह यहां सही ढंग से काम कर सकता है क्योंकि आप केवल संख्याओं की तुलना कर रहे हैं, लेकिन सामान्य स्थिति में यह गलत और बग है।
आप एक सूची समझ का उपयोग कर सकते हैं:
def remove_values_from_list(the_list, val):
return [value for value in the_list if value != val]
x = [1, 2, 3, 4, 2, 2, 3]
x = remove_values_from_list(x, 2)
print x
# [1, 3, 4, 3]
in
ऑपरेटर और remove
विधि दोनों पूरी सूची को स्कैन करते हैं (जब तक कि उन्हें कोई मैच नहीं मिल जाता है) तो आप सूची को उस तरह से कई बार स्कैन करते हैं।
यदि मूल सूची को संशोधित किया जाना चाहिए, तो आप स्लाइस असाइनमेंट का उपयोग कर सकते हैं, जबकि अभी भी एक कुशल सूची समझ (या जनरेटर अभिव्यक्ति) का उपयोग कर रहे हैं।
>>> x = [1, 2, 3, 4, 2, 2, 3]
>>> x[:] = (value for value in x if value != 2)
>>> x
[1, 3, 4, 3]
x = [ v for v in x if x != 2 ]
प्रस्तावों के विपरीत है , जो एक नई सूची बनाते हैं और इसे संदर्भित करने के लिए x बदलते हैं, मूल सूची को अछूता छोड़कर।
पहले पोस्ट के समाधान को और अधिक सार तरीके से दोहराते हुए:
>>> x = [1, 2, 3, 4, 2, 2, 3]
>>> while 2 in x: x.remove(2)
>>> x
[1, 3, 4, 3]
x = [1] * 10000 + [2] * 1000
। लूप बॉडी 1000 बार निष्पादित होती है और .remove () में हर बार 10000 तत्वों को छोड़ना पड़ता है। मेरे लिए O (n * n) जैसी गंध आती है लेकिन कोई प्रमाण नहीं है। मुझे लगता है कि प्रमाण यह मानना होगा कि सूची में 2s की संख्या इसकी लंबाई के लिए आनुपातिक है। यह आनुपातिकता कारक तब बड़े-ओ संकेतन में गायब हो जाता है। सबसे अच्छा मामला, हालांकि, सूची में केवल 2s की निरंतर संख्या, O (n ^ 2) नहीं है, बस O (2n) जो O (n) है।
उपरोक्त सभी उत्तर (मार्टिन एंडरसन के अलावा) मूल सूची से आइटम हटाने के बजाय वांछित वस्तुओं के बिना एक नई सूची बनाते हैं।
>>> import random, timeit
>>> a = list(range(5)) * 1000
>>> random.shuffle(a)
>>> b = a
>>> print(b is a)
True
>>> b = [x for x in b if x != 0]
>>> print(b is a)
False
>>> b.count(0)
0
>>> a.count(0)
1000
>>> b = a
>>> b = filter(lambda a: a != 2, x)
>>> print(b is a)
False
यह महत्वपूर्ण हो सकता है यदि आपके पास चारों ओर लटकी हुई सूची के अन्य संदर्भ हैं।
सूची को जगह में संशोधित करने के लिए, इस तरह से एक विधि का उपयोग करें
>>> def removeall_inplace(x, l):
... for _ in xrange(l.count(x)):
... l.remove(x)
...
>>> removeall_inplace(0, b)
>>> b is a
True
>>> a.count(0)
0
जहां तक गति का सवाल है, मेरे लैपटॉप पर परिणाम हैं (सभी 5000 प्रविष्टि सूची पर 1000 प्रविष्टियों को हटा दिया गया है)
तो .remove लूप लगभग 100x धीमा है ........ हम्म, शायद एक अलग दृष्टिकोण की आवश्यकता है। सबसे तेज़ जो मैंने पाया है वह सूची समझ का उपयोग कर रहा है, लेकिन फिर मूल सूची की सामग्री को बदल दें।
>>> def removeall_replace(x, l):
.... t = [y for y in l if y != x]
.... del l[:]
.... l.extend(t)
def remove_all(x, l): return [y for y in l if y != x]
तत्पश्चातl = remove_all(3,l)
पठनीयता की कीमत पर, मुझे लगता है कि यह संस्करण थोड़ा तेज़ है क्योंकि यह सूची को पुन: परीक्षण करने के लिए मजबूर नहीं करता है, इस प्रकार ठीक उसी काम को हटाने के लिए वैसे भी करना पड़ता है:
x = [1, 2, 3, 4, 2, 2, 3]
def remove_values_from_list(the_list, val):
for i in range(the_list.count(val)):
the_list.remove(val)
remove_values_from_list(x, 2)
print(x)
1.000.000 तत्वों के साथ एक सूची / सरणी के खिलाफ नोमी दृष्टिकोण और समय:
समय:
In [10]: a.shape
Out[10]: (1000000,)
In [13]: len(lst)
Out[13]: 1000000
In [18]: %timeit a[a != 2]
100 loops, best of 3: 2.94 ms per loop
In [19]: %timeit [x for x in lst if x != 2]
10 loops, best of 3: 79.7 ms per loop
निष्कर्ष: लिस्ट कॉम्प्रिहेंशन एप्रोच की तुलना में सुन्नत (मेरी नोटबुक पर) 27 गुना तेज है
पुनश्च यदि आप अपनी नियमित पायथन सूची lst
को सुपीरियर सरणी में बदलना चाहते हैं :
arr = np.array(lst)
सेट अप:
import numpy as np
a = np.random.randint(0, 1000, 10**6)
In [10]: a.shape
Out[10]: (1000000,)
In [12]: lst = a.tolist()
In [13]: len(lst)
Out[13]: 1000000
चेक:
In [14]: a[a != 2].shape
Out[14]: (998949,)
In [15]: len([x for x in lst if x != 2])
Out[15]: 998949
a = [1, 2, 2, 3, 1]
to_remove = 1
a = [i for i in a if i != to_remove]
print(a)
शायद सबसे अजगर नहीं, लेकिन फिर भी मेरे लिए सबसे आसान है
सभी डुप्लिकेट घटनाओं को हटाने और सूची में एक को छोड़ने के लिए:
test = [1, 1, 2, 3]
newlist = list(set(test))
print newlist
[1, 2, 3]
यहाँ परियोजना यूलर के लिए उपयोग किया गया कार्य है:
def removeOccurrences(e):
return list(set(e))
मेरा मानना है कि अगर आप सूचियों के आदेश की परवाह नहीं करते हैं, तो यह किसी भी अन्य तरीके से संभवत: तेज है, यदि आप अंतिम क्रम के बारे में ध्यान रखते हैं तो अनुक्रमणिका को मूल से स्टोर करें और उसके द्वारा सहारा लें।
category_ids.sort()
ones_last_index = category_ids.count('1')
del category_ids[0:ones_last_index]
for i in range(a.count(' ')):
a.remove(' ')
ज्यादा आसान मैं मानता हूं।
चलो
>>> x = [1, 2, 3, 4, 2, 2, 3]
पहले से पहले के रूप में सरल और कुशल समाधान है
>>> x[:] = [v for v in x if v != 2]
>>> x
[1, 3, 4, 3]
एक और संभावना जो कम स्मृति का उपयोग करना चाहिए लेकिन धीमी हो
>>> for i in range(len(x) - 1, -1, -1):
if x[i] == 2:
x.pop(i) # takes time ~ len(x) - i
>>> x
[1, 3, 4, 3]
10% मिलान प्रविष्टियों के साथ लंबाई 1000 और 100000 की सूची के लिए परिणाम: 0.16 बनाम 0.25 एमएस, और 23 बनाम 123 एमएस।
lists = [6.9,7,8.9,3,5,4.9,1,2.9,7,9,12.9,10.9,11,7]
def remove_values_from_list():
for list in lists:
if(list!=7):
print(list)
remove_values_from_list()
परिणाम: 6.9 8.9 3 5 4.9 1 2.9 9 12.9 10.9 11
lists = [6.9,7,8.9,3,5,4.9,1,2.9,7,9,12.9,10.9,11,7]
def remove_values_from_list(remove):
for list in lists:
if(list!=remove):
print(list)
remove_values_from_list(7)
परिणाम: 6.9 8.9 3 5 4.9 1 2.9 9 12.9 10.9 11
hello = ['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd']
#chech every item for a match
for item in range(len(hello)-1):
if hello[item] == ' ':
#if there is a match, rebuild the list with the list before the item + the list after the item
hello = hello[:item] + hello [item + 1:]
print hello
['नमस्ते दुनिया']
हम del
या तो सभी जगह का उपयोग कर सकते हैं या pop
:
import random
def remove_values_from_list(lst, target):
if type(lst) != list:
return lst
i = 0
while i < len(lst):
if lst[i] == target:
lst.pop(i) # length decreased by 1 already
else:
i += 1
return lst
remove_values_from_list(None, 2)
remove_values_from_list([], 2)
remove_values_from_list([1, 2, 3, 4, 2, 2, 3], 2)
lst = remove_values_from_list([random.randrange(0, 10) for x in range(1000000)], 2)
print(len(lst))
अब दक्षता के लिए:
In [21]: %timeit -n1 -r1 x = random.randrange(0,10)
1 loop, best of 1: 43.5 us per loop
In [22]: %timeit -n1 -r1 lst = [random.randrange(0, 10) for x in range(1000000)]
g1 loop, best of 1: 660 ms per loop
In [23]: %timeit -n1 -r1 lst = remove_values_from_list([random.randrange(0, 10) for x in range(1000000)]
...: , random.randrange(0,10))
1 loop, best of 1: 11.5 s per loop
In [27]: %timeit -n1 -r1 x = random.randrange(0,10); lst = [a for a in [random.randrange(0, 10) for x in
...: range(1000000)] if x != a]
1 loop, best of 1: 710 ms per loop
जैसा कि हम देखते हैं कि इन-प्लेस संस्करण remove_values_from_list()
को किसी अतिरिक्त मेमोरी की आवश्यकता नहीं है, लेकिन इसे चलाने में इतना अधिक समय लगता है:
किसी ने समय और स्थान की जटिलता के लिए एक इष्टतम उत्तर पोस्ट नहीं किया है, इसलिए मैंने सोचा कि मैं इसे एक शॉट दूंगा। यहां एक समाधान है जो एक नई सरणी बनाने और एक कुशल समय जटिलता के बिना एक विशिष्ट मूल्य की सभी घटनाओं को हटा देता है। दोष यह है कि तत्व आदेश को बनाए नहीं रखते हैं ।
समय जटिलता: O (n)
अतिरिक्त स्थान जटिलता: O (1)
def main():
test_case([1, 2, 3, 4, 2, 2, 3], 2) # [1, 3, 3, 4]
test_case([3, 3, 3], 3) # []
test_case([1, 1, 1], 3) # [1, 1, 1]
def test_case(test_val, remove_val):
remove_element_in_place(test_val, remove_val)
print(test_val)
def remove_element_in_place(my_list, remove_value):
length_my_list = len(my_list)
swap_idx = length_my_list - 1
for idx in range(length_my_list - 1, -1, -1):
if my_list[idx] == remove_value:
my_list[idx], my_list[swap_idx] = my_list[swap_idx], my_list[idx]
swap_idx -= 1
for pop_idx in range(length_my_list - swap_idx - 1):
my_list.pop() # O(1) operation
if __name__ == '__main__':
main()
गति के बारे में!
import time
s_time = time.time()
print 'start'
a = range(100000000)
del a[:]
print 'finished in %0.2f' % (time.time() - s_time)
# start
# finished in 3.25
s_time = time.time()
print 'start'
a = range(100000000)
a = []
print 'finished in %0.2f' % (time.time() - s_time)
# start
# finished in 2.11
क्या गलत है:
Motor=['1','2','2']
For i in Motor:
If i != '2':
Print(i)
Print(motor)
एनाकोंडा का उपयोग करना