Menghapus banyak elemen dari daftar

160

Apakah mungkin menghapus beberapa elemen sekaligus dari daftar? Jika saya ingin menghapus elemen pada indeks 0 dan 2, dan mencoba sesuatu seperti del somelist[0], diikuti oleh del somelist[2], pernyataan kedua sebenarnya akan dihapus somelist[3].

Saya kira saya selalu bisa menghapus elemen bernomor lebih tinggi terlebih dahulu, tetapi saya berharap ada cara yang lebih baik.

Løiten
sumber

Jawaban:

110

Anda dapat menggunakan enumeratedan menghapus nilai yang indeksnya cocok dengan indeks yang ingin Anda hapus:

indices = 0, 2
somelist = [i for j, i in enumerate(somelist) if j not in indices]
SilentGhost
sumber
2
Hampir, hanya jika Anda menghapus seluruh daftar. itu akan menjadi len (indeks) * len (somelist). Ini juga membuat salinan, yang mungkin atau mungkin tidak diinginkan
Richard Levasseur
jika Anda memeriksa nilai dalam daftar, itu adalah. operator 'in' bekerja pada nilai-nilai daftar, sedangkan operator bekerja pada kunci dict. Jika saya salah, tolong tunjukkan saya ke pep / referensi
Richard Levasseur
5
alasan saya memilih tuple untuk indeks hanyalah kesederhanaan catatan. itu akan menjadi pekerjaan yang sempurna untuk set () memberikan O (n)
SilentGhost
18
Ini sama sekali tidak menghapus item dari somelist, tetapi membuat daftar baru. Jika ada yang menahan referensi ke daftar asli, itu masih akan memiliki semua item di dalamnya.
Tom Future
2
@ SilentGhost Tidak perlu melakukan enumerasi. Bagaimana dengan ini somelist = [ lst[i] for i in xrange(len(lst)) if i not in set(indices) ]:?
ToolmakerSteve
183

Untuk beberapa alasan saya tidak suka jawaban di sini. Ya, mereka bekerja, tetapi sebenarnya sebagian besar dari mereka tidak menghapus elemen dalam daftar, bukan? (Tetapi membuat salinan dan kemudian mengganti yang asli dengan salinan yang diedit).

Kenapa tidak hapus saja indeks yang lebih tinggi dulu?

Apakah ada alasan untuk ini? Saya hanya akan melakukan:

for i in sorted(indices, reverse=True):
    del somelist[i]

Jika Anda benar-benar tidak ingin menghapus item mundur, maka saya kira Anda hanya harus deincrement nilai indeks yang lebih besar dari indeks yang dihapus terakhir (tidak dapat benar-benar menggunakan indeks yang sama karena Anda memiliki daftar yang berbeda) atau menggunakan salinan daftar (yang tidak akan 'dihapus' tetapi mengganti yang asli dengan salinan yang diedit).

Apakah saya kehilangan sesuatu di sini, ada alasan untuk TIDAK menghapus dalam urutan terbalik?

tglaria
sumber
1
Saya tidak tahu mengapa ini belum dipilih sebagai jawaban yang diterima !. Terima kasih untuk ini.
swathis
4
Ada dua alasan. (a) Untuk daftar, kompleksitas waktu akan lebih tinggi daripada metode "buat salinan" (menggunakan seperangkat indeks) secara rata-rata (dengan asumsi indeks acak) karena beberapa elemen perlu digeser ke depan beberapa kali. (B) Setidaknya bagi saya, sulit dibaca, karena ada semacam fungsi yang tidak sesuai dengan logika program yang sebenarnya, dan hanya ada untuk alasan teknis. Meskipun sekarang saya sudah memahami logika secara menyeluruh, saya masih merasa akan sulit untuk dibaca.
Imperishable Night
1
@ImperishableNightcould you elaborate (a)? Saya tidak mengerti "beberapa elemen perlu digeser". Untuk (b) Anda bisa mendefinisikan suatu fungsi jika Anda perlu membaca kejelasan.
tglaria
109

Jika Anda menghapus beberapa item yang tidak berdekatan, maka apa yang Anda gambarkan adalah cara terbaik (dan ya, pastikan untuk memulai dari indeks tertinggi).

Jika item Anda berdekatan, Anda dapat menggunakan sintaks penugasan slice:

a[2:10] = []
Greg Hewgill
sumber
95
Anda juga bisa mengatakan del a[2:10]dengan efek yang sama.
sth
8
@sth Menariknya, del sedikit lebih cepat daripada penugasan.
theouroureye
24

Anda dapat menggunakan numpy.deletesebagai berikut:

import numpy as np
a = ['a', 'l', 3.14, 42, 'u']
I = [0, 2]
np.delete(a, I).tolist()
# Returns: ['l', '42', 'u']

Jika Anda tidak keberatan berakhir dengan numpyarray di bagian akhir, Anda dapat meninggalkan .tolist(). Anda juga harus melihat peningkatan kecepatan yang cukup besar, menjadikan ini solusi yang lebih skalabel. Saya belum membandingkannya, tetapi numpyoperasi dikompilasi kode yang ditulis dalam C atau Fortran.

phile
sumber
1
solusi umum ketika elemen tidak berurutan +1
noɥʇʎԀʎzɐɹƆ
1
pertanyaan di sini, bagaimana dengan menghapus ['a', 42].
evanhutomo
Poin bonus BESAR untuk solusi ini, dibandingkan dengan yang lain, untuk kecepatan. Apa yang dapat saya katakan adalah bahwa untuk kumpulan data yang sangat besar, perlu beberapa menit bagi saya untuk mencapai sesuatu yang hanya butuh beberapa detik dengan baik numpy.
Legel
18

Sebagai spesialisasi jawaban Greg, Anda bahkan dapat menggunakan sintaks irisan yang diperluas. misalnya. Jika Anda ingin menghapus item 0 dan 2:

>>> a= [0, 1, 2, 3, 4]
>>> del a[0:3:2]
>>> a
[1, 3, 4]

Tentu saja, ini tidak mencakup pemilihan yang sewenang-wenang, tetapi tentu saja dapat menghapus semua item.

bobince
sumber
16

Sebagai fungsi:

def multi_delete(list_, *args):
    indexes = sorted(list(args), reverse=True)
    for index in indexes:
        del list_[index]
    return list_

Berjalan dalam waktu n log (n) , yang seharusnya menjadikannya solusi tercepat tercepat.

Nikhil Chelliah
sumber
1
Versi dengan args.sort (). Reverse () jelas lebih baik. Ini juga terjadi pada diktat alih-alih melemparkan atau, lebih buruk, secara diam-diam merusak.
sort () tidak ditentukan untuk tuple, Anda harus mengonversi ke daftar terlebih dahulu. sort () mengembalikan Tidak, jadi Anda tidak dapat menggunakan terbalik () di atasnya.
SilentGhost
@ R. Pate: Saya menghapus versi pertama karena alasan itu. Terima kasih. @ SilentGhost: Memperbaikinya.
Nikhil Chelliah
@Nikhil: tidak Anda tidak;) args = daftar (args) args.sort () args.reverse () tapi lebih baik pilihan akan: args = diurutkan (args, reverse = True)
SilentGhost
2
n log n? Betulkah? Saya tidak berpikir del list[index]O (1).
user202729
12

Jadi, Anda pada dasarnya ingin menghapus beberapa elemen sekaligus? Dalam hal ini, posisi elemen berikutnya yang akan dihapus akan diimbangi dengan banyaknya yang dihapus sebelumnya.

Tujuan kami adalah menghapus semua vokal, yang diperhitungkan sebagai indeks 1, 4, dan 7. Perhatikan bahwa yang penting adalah indeks to_delete dalam urutan menaik, jika tidak maka tidak akan berfungsi.

to_delete = [1, 4, 7]
target = list("hello world")
for offset, index in enumerate(to_delete):
  index -= offset
  del target[index]

Akan lebih rumit jika Anda ingin menghapus elemen dalam urutan apa pun. IMO, menyortir to_deletemungkin lebih mudah daripada mencari tahu kapan Anda harus atau tidak harus mengurangi index.

Richard Levasseur
sumber
8

Saya seorang pemula total dalam Python, dan pemrograman saya saat ini adalah kasar dan kotor untuk sedikitnya, tetapi solusi saya adalah dengan menggunakan kombinasi dari perintah dasar yang saya pelajari di tutorial awal:

some_list = [1,2,3,4,5,6,7,8,10]
rem = [0,5,7]

for i in rem:
    some_list[i] = '!' # mark for deletion

for i in range(0, some_list.count('!')):
    some_list.remove('!') # remove
print some_list

Jelas, karena harus memilih karakter "mark-for-deletion", ini memiliki keterbatasan.

Adapun kinerja sebagai ukuran daftar skala, saya yakin solusi saya tidak optimal. Namun, ini mudah, yang saya harap menarik bagi pemula lain, dan akan bekerja dalam kasus-kasus sederhana di mana some_listadalah format yang terkenal, misalnya, selalu numerik ...

Paul
sumber
2
alih-alih menggunakan '!' sebagai karakter khusus Anda, gunakan Tidak Ada. Ini membuat setiap karakter valid dan membebaskan kemungkinan Anda
portforwardpodcast
5

Berikut ini adalah alternatif, yang tidak menggunakan enumerate () untuk membuat tupel (seperti dalam jawaban asli SilentGhost).

Ini sepertinya lebih mudah dibaca oleh saya. (Mungkin saya akan merasa berbeda jika saya terbiasa menggunakan penghitungan.) CAVEAT: Saya belum menguji kinerja dari dua pendekatan.

# Returns a new list. "lst" is not modified.
def delete_by_indices(lst, indices):
    indices_as_set = set(indices)
    return [ lst[i] for i in xrange(len(lst)) if i not in indices_as_set ]

CATATAN: Sintaks Python 2.7. Untuk Python 3, xrange=> range.

Pemakaian:

lst = [ 11*x for x in xrange(10) ]
somelist = delete_by_indices( lst, [0, 4, 5])

somelist:

[11, 22, 33, 66, 77, 88, 99]

--- BONUS ---

Hapus beberapa nilai dari daftar. Artinya, kami memiliki nilai yang ingin kami hapus:

# Returns a new list. "lst" is not modified.
def delete__by_values(lst, values):
    values_as_set = set(values)
    return [ x for x in lst if x not in values_as_set ]

Pemakaian:

somelist = delete__by_values( lst, [0, 44, 55] )

somelist:

[11, 22, 33, 66, 77, 88, 99]

Ini adalah jawaban yang sama seperti sebelumnya, tetapi kali ini kami menyediakan NILAI yang akan dihapus [0, 44, 55].

ToolmakerSteve
sumber
Saya telah memutuskan @ SilentGhost hanya sulit dibaca, karena nama variabel non-deskriptif yang digunakan untuk hasil penghitungan. Selain itu, orangtua akan membuatnya lebih mudah dibaca. Jadi di sini adalah bagaimana saya akan kata solusinya (dengan "set" menambahkan, untuk kinerja): [ value for (i, value) in enumerate(lst) if i not in set(indices) ]. Tetapi saya akan meninggalkan jawaban saya di sini, karena saya juga menunjukkan cara menghapus berdasarkan nilai. Ini kasus yang lebih mudah, tetapi mungkin bisa membantu seseorang.
ToolmakerSteve
@ Veedrac- terima kasih; Saya telah menulis ulang untuk membangun set pertama. Bagaimana menurut Anda - solusi lebih cepat sekarang daripada SilentGhost? (Saya tidak menganggap itu cukup penting untuk benar-benar waktu itu, hanya meminta pendapat Anda.) Demikian pula, saya akan menulis ulang SilentGhost ini versi sebagai indices_as_set = set(indices), [ value for (i, value) in enumerate(lst) if i not in indices_as_set ], untuk mempercepat itu.
ToolmakerSteve
Apakah ada alasan gaya untuk menggarisbawahi ganda delete__by_values()?
Tom
5

Metode pemahaman daftar alternatif yang menggunakan nilai indeks daftar:

stuff = ['a', 'b', 'c', 'd', 'e', 'f', 'woof']
index = [0, 3, 6]
new = [i for i in stuff if stuff.index(i) not in index]

Ini mengembalikan:

['b', 'c', 'e', 'f']
meong
sumber
jawaban yang bagus, tetapi menyebut daftar indeks sebagai indexmenyesatkan karena dalam daftar iterator digunakan metodeindex()
Joe
4

di sini adalah metode lain yang menghilangkan elemen di tempatnya. juga jika daftar Anda sangat panjang, lebih cepat.

>>> a = range(10)
>>> remove = [0,4,5]
>>> from collections import deque
>>> deque((list.pop(a, i) for i in sorted(remove, reverse=True)), maxlen=0)

>>> timeit.timeit('[i for j, i in enumerate(a) if j not in remove]', setup='import random;remove=[random.randrange(100000) for i in range(100)]; a = range(100000)', number=1)
0.1704120635986328

>>> timeit.timeit('deque((list.pop(a, i) for i in sorted(remove, reverse=True)), maxlen=0)', setup='from collections import deque;import random;remove=[random.randrange(100000) for i in range(100)]; a = range(100000)', number=1)
0.004853963851928711
pengguna545424
sumber
+1: Penggunaan deque yang menarik untuk melakukan aksi sebagai bagian dari ekspresi, daripada membutuhkan blok "untuk ..:". Namun, untuk kasus sederhana ini, saya menemukan Nikhil's for block lebih mudah dibaca.
ToolmakerSteve
4

Ini telah disebutkan, tetapi entah bagaimana tidak ada yang berhasil melakukannya dengan benar.

Pada O(n)solusi akan menjadi:

indices = {0, 2}
somelist = [i for j, i in enumerate(somelist) if j not in indices]

Ini sangat dekat dengan versi SilentGhost , tetapi menambahkan dua kawat gigi.

Veedrac
sumber
Ini bukan O(n)jika Anda menghitung pencarian yang dilakukan log(len(indices))untuk setiap iterasi.
Fisikawan Gila
@MadPhysicist j not in indicesadalah O(1).
Veedrac
Saya tidak yakin bagaimana Anda mendapatkan nomor itu. Karena indeks adalah himpunan, j not in indicesmasih memerlukan pencarian, yaitu O(log(len(indices))). Sementara saya setuju bahwa pencarian dalam set 2 elemen memenuhi syarat sebagai O(1), dalam kasus umum akan O(log(N)). Either way O(N log(N))masih berdetak O(N^2).
Fisikawan Gila
3
@MadPhysicist j not in indicesadalah O(1), serius.
Veedrac
Dan apa yang sebenarnya dilakukan oleh dua kawat gigi?
Nuklir03020704
4
l = ['a','b','a','c','a','d']
to_remove = [1, 3]
[l[i] for i in range(0, len(l)) if i not in to_remove])

Ini pada dasarnya sama dengan jawaban terpilih, hanya cara penulisan yang berbeda. Perhatikan bahwa menggunakan l.index () bukan ide yang baik, karena ia tidak dapat menangani elemen yang digandakan dalam daftar.

seng
sumber
2

Metode penghapusan akan menyebabkan banyak pergeseran elemen daftar. Saya pikir lebih baik membuat salinan:

...
new_list = []
for el in obj.my_list:
   if condition_is_true(el):
      new_list.append(el)
del obj.my_list
obj.my_list = new_list
...
luca
sumber
2

secara teknis, jawabannya TIDAK, tidak mungkin menghapus dua objek PADA SAAT YANG SAMA. Namun, itu mungkin untuk menghapus dua objek dalam satu baris python yang indah.

del (foo['bar'],foo['baz'])

akan secara berulang menghapus foo['bar'], kemudianfoo['baz']

David Brilliant
sumber
Ini dihapus dari objek dict, bukan daftar, tapi aku masih memberi +1 karena sangat cantik!
Ulf Aslak
Itu berlaku untuk daftar juga, dengan sintaksis yang sesuai. Namun klaimnya adalah bahwa tidak mungkin untuk menghapus dua objek sekaligus adalah salah; lihat jawaban oleh @bobince
Pedro Gimeno
2

kita dapat melakukan ini dengan menggunakan perulangan for iterating di atas indeks setelah mengurutkan daftar indeks dalam urutan menurun

mylist=[66.25, 333, 1, 4, 6, 7, 8, 56, 8769, 65]
indexes = 4,6
indexes = sorted(indexes, reverse=True)
for i in index:
    mylist.pop(i)
print mylist
Gourav Singla
sumber
2

Untuk indeks 0 dan 2 dari listA:

for x in (2,0): listA.pop(x)

Untuk beberapa indeks acak untuk dihapus dari listA:

indices=(5,3,2,7,0) 
for x in sorted(indices)[::-1]: listA.pop(x)
selai
sumber
2

Saya ingin cara untuk membandingkan berbagai solusi yang membuatnya mudah untuk memutar kenop.

Pertama saya menghasilkan data saya:

import random

N = 16 * 1024
x = range(N)
random.shuffle(x)
y = random.sample(range(N), N / 10)

Lalu saya mendefinisikan fungsi saya:

def list_set(value_list, index_list):
    index_list = set(index_list)
    result = [value for index, value in enumerate(value_list) if index not in index_list]
    return result

def list_del(value_list, index_list):
    for index in sorted(index_list, reverse=True):
        del(value_list[index])

def list_pop(value_list, index_list):
    for index in sorted(index_list, reverse=True):
        value_list.pop(index)

Kemudian saya timeitmembandingkan solusi:

import timeit
from collections import OrderedDict

M = 1000
setup = 'from __main__ import x, y, list_set, list_del, list_pop'
statement_dict = OrderedDict([
    ('overhead',  'a = x[:]'),
    ('set', 'a = x[:]; list_set(a, y)'),
    ('del', 'a = x[:]; list_del(a, y)'),
    ('pop', 'a = x[:]; list_pop(a, y)'),
])

overhead = None
result_dict = OrderedDict()
for name, statement in statement_dict.iteritems():
    result = timeit.timeit(statement, number=M, setup=setup)
    if overhead is None:
        overhead = result
    else:
        result = result - overhead
        result_dict[name] = result

for name, result in result_dict.iteritems():
    print "%s = %7.3f" % (name, result)

Keluaran

set =   1.711
del =   3.450
pop =   3.618

Jadi generator dengan indeks dalam setadalah pemenangnya. Dan delsedikit lebih cepat pop.

David Cullen
sumber
Terima kasih atas perbandingan ini, ini membuat saya membuat tes sendiri (sebenarnya hanya meminjam kode Anda) dan untuk sejumlah kecil item yang dihapus, overhead untuk membuat SET menjadikannya solusi terburuk (gunakan 10, 100, 500 untuk panjang 'y' dan Anda akan melihat). Karena sebagian besar waktu, ini tergantung pada aplikasi.
tglaria
2

Anda dapat menggunakan logika ini:

my_list = ['word','yes','no','nice']

c=[b for i,b in enumerate(my_list) if not i in (0,2,3)]

print c
raghu
sumber
2

Implementasi lain dari gagasan menghapus dari indeks tertinggi.

for i in range(len(yourlist)-1, -1, -1):
    del yourlist(i)
ipramusinto
sumber
1

Saya benar-benar dapat memikirkan dua cara untuk melakukannya:

  1. iris daftar seperti (ini menghapus elemen 1, 3 dan 8)

    somelist = somelist [1: 2] + somelist [3: 7] + somelist [8:]

  2. lakukan itu di tempat, tetapi satu per satu:

    somelist.pop (2) somelist.pop (0)

Bartosz Radaczyński
sumber
1

Anda dapat melakukannya dengan cara dict, bukan pada daftar. Dalam daftar, elemen-elemen berada dalam urutan. Dict mereka hanya bergantung pada indeks.

Kode sederhana hanya untuk menjelaskannya dengan melakukan :

>>> lst = ['a','b','c']
>>> dct = {0: 'a', 1: 'b', 2:'c'}
>>> lst[0]
'a'
>>> dct[0]
'a'
>>> del lst[0]
>>> del dct[0]
>>> lst[0]
'b'
>>> dct[0]
Traceback (most recent call last):
  File "<pyshell#19>", line 1, in <module>
    dct[0]
KeyError: 0
>>> dct[1]
'b'
>>> lst[1]
'c'

Cara untuk "mengonversi" daftar dalam suatu dikt adalah:

>>> dct = {}
>>> for i in xrange(0,len(lst)): dct[i] = lst[i]

Kebalikannya adalah:

lst = [dct[i] for i in sorted(dct.keys())] 

Pokoknya saya pikir lebih baik untuk mulai menghapus dari indeks yang lebih tinggi seperti yang Anda katakan.

Andrea Ambu
sumber
Apakah Python menjamin [dct [i] untuk saya dalam dct] akan selalu menggunakan peningkatan nilai i? Jika demikian, daftar (dct.values ​​()) pasti lebih baik.
Saya tidak memikirkan hal itu. Kamu benar. Tidak ada jaminan ketika saya membaca [di sini] [1] bahwa barang akan diambil secara berurutan, atau setidaknya urutan yang diharapkan. Saya diedit. [1]: docs.python.org/library/stdtypes.html#dict.items
Andrea Ambu
2
Jawaban ini berbicara tentang kamus dengan cara yang salah secara fundamental. Kamus memiliki KUNCI (bukan INDIKES). Ya, pasangan kunci / nilai tidak tergantung satu sama lain. Tidak, tidak masalah bagaimana Anda menghapus entri. Konversi ke kamus hanya untuk menghapus beberapa elemen dari daftar akan berlebihan.
ToolmakerSteve
1

Untuk menggeneralisasi komentar dari @sth . Penghapusan item dalam kelas apa pun, yang mengimplementasikan abc.MutableSequence , dan listkhususnya, dilakukan melalui __delitem__metode ajaib. Metode ini bekerja mirip dengan __getitem__, artinya dapat menerima integer atau slice. Berikut ini sebuah contoh:

class MyList(list):
    def __delitem__(self, item):
        if isinstance(item, slice):
            for i in range(*item.indices(len(self))):
                self[i] = 'null'
        else:
            self[item] = 'null'


l = MyList(range(10))
print(l)
del l[5:8]
print(l)

Ini akan menampilkan

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 'null', 'null', 'null', 8, 9]
Alexander Zhukov
sumber
1

Mengimpornya hanya karena alasan ini mungkin berlebihan, tetapi jika Anda pandastetap menggunakannya , maka solusinya sederhana dan langsung:

import pandas as pd
stuff = pd.Series(['a','b','a','c','a','d'])
less_stuff = stuff[stuff != 'a']  # define any condition here
# results ['b','c','d']
Lorinc Nyitrai
sumber
1
some_list.remove(some_list[max(i, j)])

Menghindari biaya penyortiran dan harus menyalin daftar secara eksplisit.

Chester
sumber
0

Bagaimana dengan salah satu dari ini (saya sangat baru di Python, tetapi tampaknya ok):

ocean_basin = ['a', 'Atlantic', 'Pacific', 'Indian', 'a', 'a', 'a']
for i in range(1, (ocean_basin.count('a') + 1)):
    ocean_basin.remove('a')
print(ocean_basin)

['Atlantik', 'Pasifik', 'India']

ob = ['a', 'b', 4, 5,'Atlantic', 'Pacific', 'Indian', 'a', 'a', 4, 'a']
remove = ('a', 'b', 4, 5)
ob = [i for i in ob if i not in (remove)]
print(ob)

['Atlantik', 'Pasifik', 'India']

pengguna12001090
sumber
0

Tidak ada jawaban yang ditawarkan sejauh ini melakukan penghapusan di tempat pada O (n) pada panjang daftar untuk sejumlah indeks sewenang-wenang untuk dihapus, jadi inilah versi saya:

def multi_delete(the_list, indices):
    assert type(indices) in {set, frozenset}, "indices must be a set or frozenset"
    offset = 0
    for i in range(len(the_list)):
        if i in indices:
            offset += 1
        elif offset:
            the_list[i - offset] = the_list[i]
    if offset:
        del the_list[-offset:]

# Example:
a = [0, 1, 2, 3, 4, 5, 6, 7]
multi_delete(a, {1, 2, 4, 6, 7})
print(a)  # prints [0, 3, 5]
Pedro Gimeno
sumber
0

Anda dapat menggunakan hapus juga.

delete_from_somelist = []
for i in [int(0), int(2)]:
     delete_from_somelist.append(somelist[i])
for j in delete_from_somelist:
     newlist = somelist.remove(j)
Jiwon Kim
sumber
0

Saya menggabungkan semuanya menjadi list_difffungsi yang hanya mengambil dua daftar sebagai input dan mengembalikan perbedaannya, sambil mempertahankan urutan asli dari daftar pertama.

def list_diff(list_a, list_b, verbose=False):

    # returns a difference of list_a and list_b,
    # preserving the original order, unlike set-based solutions

    # get indices of elements to be excluded from list_a
    excl_ind = [i for i, x in enumerate(list_a) if x in list_b]
    if verbose:
        print(excl_ind)

    # filter out the excluded indices, producing a new list 
    new_list = [i for i in list_a if list_a.index(i) not in excl_ind]
    if verbose:
        print(new_list)

    return(new_list)

Penggunaan sampel:

my_list = ['a', 'b', 'c', 'd', 'e', 'f', 'woof']
# index = [0, 3, 6]

# define excluded names list
excl_names_list = ['woof', 'c']

list_diff(my_list, excl_names_list)
>> ['a', 'b', 'd', 'e', 'f']
mirekphd
sumber