[python] هل تريد إزالة كل تكرارات قيمة من قائمة؟


Answers

يمكنك استخدام فهم القائمة:

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]
Question

في Python ، remove() التواجد الأول للقيمة في القائمة.

كيفية إزالة جميع تكرارات قيمة من قائمة ، دون فرز القائمة؟

هذا ما أفكر فيه.

>>> x = [1, 2, 3, 4, 2, 2, 3]
>>> def remove_values_from_list(the_list, val):
        while val in the_list:
            the_list.remove(val)
>>> remove_values_from_list(x, 2)
>>> x
[1, 3, 4, 3]



انت تستطيع فعل ذالك

while 2 in x:   
    x.remove(2)



ما المشكلة في:

المحرك = ['1' ، '2' ، '2'] لأني في السيارات: إذا كنت! = '2': Print (i) Print (motor)

باستخدام اناكوندا




قم بإزالة كل تكرارات قيمة من قائمة Python

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" ""




جميع الإجابات أعلاه (بخلاف Martin Andersson) تنشئ قائمة جديدة بدون العناصر المطلوبة ، بدلاً من إزالة العناصر من القائمة الأصلية.

>>> 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)

  • فهم القائمة - ~ 400us
  • مرشح - ~ 900us
  • .remove () حلقة - 50ms

لذا فإن حلقة .remove تكون أبطأ بـ 100x ........ هممم ، ربما هناك حاجة إلى نهج مختلف. أسرع ما وجدته هو استخدام فهم القائمة ، ولكن بعد ذلك استبدال محتويات القائمة الأصلية.

>>> def removeall_replace(x, l):
....    t = [y for y in l if y != x]
....    del l[:]
....    l.extend(t)
  • removeeall_replace () - 450us



عن السرعة!

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



تكرار حل المشاركة الأولى بطريقة أكثر تجريدًا:

>>> x = [1, 2, 3, 4, 2, 2, 3]
>>> while 2 in x: x.remove(2)
>>> x
[1, 3, 4, 3]



أعتقد أن هذا ربما يكون أسرع من أي طريقة أخرى إذا كنت لا تهتم بترتيب القوائم ، إذا كنت تهتم بمخزن الطلب النهائي فهارس من الأصل وتلتزم بذلك.

category_ids.sort()
ones_last_index = category_ids.count('1')
del category_ids[0:ones_last_index]



Links



Tags

python python   list