ලැයිස්තු අංගයක් අගය අනුව මකා දැමීමට සරල ක්‍රමයක් තිබේද?


962

ලැයිස්තුවක් තුළ ලැයිස්තුවක් තිබේ නම් එය ඉවත් කිරීමට මට අවශ්‍යය (එය එසේ නොවිය හැක).

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
ඔබේ කේතය ඩෙල් ප්‍රකාශයට ළඟා නොවන බැවින් ලැයිස්තුවක වටිනාකමක් මකාදැමීමට මෙයට කිසිදු සම්බන්ධයක් නැත. සමහර විට ඔබ එය නැවත සඳහන් කළ යුතුය "ලැයිස්තුවේ නැති වටිනාකමේ දර්ශකය මා ලබා ගන්නේ කෙසේද? පැහැදිලි පිළිතුර - ඔබට බැහැ.
ඩේව් කිරිබි

57
Ave ඩේව් හොඳයි, ඇත්තටම නැහැ. අයිතමයක් තිබේද නැද්ද යන්න නොසලකා ලැයිස්තුවෙන් මකා දැමීමට ඔහුට අවශ්‍යය, නැති අයිතමයක් සඳහා දර්ශකය ලබා නොගැනීම. ප්‍රශ්නය හොඳින් අසනු ලැබේ.
ibz

1
කාරණයට අමතරව, හිස් exceptදෙයක් නරක පුරුද්දකි . except Exceptionඅවම වශයෙන් භාවිතා කරන්න .
wjandrea

Answers:


1585

ලැයිස්තුවක මූලද්‍රව්‍යයේ පළමු සිදුවීම ඉවත් කිරීමට, සරලව භාවිතා කරන්න 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]

149
මූලද්රව්යය ලැයිස්තුවේ නොමැති නම් අසමත් වේ. :)
ibz

22
මූලද්‍රව්‍යය ලැයිස්තුවේ නොමැති වුවද @ibz ලැයිස්තු අවබෝධය අසමත් නොවේ ද?
අයිසැක්ස්

78
හීනවන ඕනෑම කෙනෙකුට පැහැදිලි කිරීම සඳහා, එය "අසමත්" වන්නේ එය ValueError ව්‍යතිරේකයක් මතු කරයි යන අර්ථයෙන් ය.
කේසි ෆෝක්

10
ලැයිස්තු අවබෝධය මඟින් ලැයිස්තු යොමු කිරීම වෙනස් කරයි, එම නිසා කොතැනක හෝ යොමු පිටපතක් තිබේ නම්, ඉවත් කිරීම අනුගමනය නොකෙරේ.
සෙබස්තියන්

1
එය O (n) ට වඩා වැඩි හෝ අඩු විය යුත්තේ මන්දැයි මම නොසිතමි. මම හිතන්නේ එය සාමාන්‍ය සෙවුම් ඇල්ගොරිතමයක් භාවිතා කරයි. ලැයිස්තුව වර්ග කිරීම පිළිබඳ අමතර තොරතුරු නොමැත!
LRDPRDX

187

සාමාන්‍යයෙන් පයිතන් ව්‍යතිරේකයක් විසි කරයි, ඔබට එය කළ නොහැකි දෙයක් කිරීමට පැවසුවහොත් ඔබට එය කිරීමට සිදුවේ:

if c in a:
    a.remove(c)

හෝ:

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

ව්‍යතිරේකයක් යනු ඔබ අපේක්ෂා කරන හා නිසි ලෙස හැසිරෙන තාක් කල් නරක දෙයක් නොවේ.


9
සුව කිරීමට වඩා වැළැක්වීම හොඳය. ඔබට පළමුව සුවිශේෂී කොන්දේසි පරීක්ෂා කළ හැකි නම් (උදාහරණ අ), ඔබ කළ යුතුය.
ගුස්ඩෝර්

83
වෙනත් භාෂාවලින් මෙය සත්‍යයක් වන අතර, පයිතන්හි “අවසරයට වඩා සමාව ඉල්ලීම පහසුය.” docs.python.org/2/glossary.html#term-eafp
ඩේව් වෙබ්

6
Us ගුස්ඩෝර්: ලැයිස්තුව නූල් අතර බෙදාගෙන තිබේ නම් a.remove(c), if c in aචෙක්පත නොතකා කෙසේ හෝ අසමත් aවිය හැකිය ( චෙක්පතෙන් පසුව c in aනමුත් a.remove(c)ඇමතුමට පෙර වෙනත් ත්‍රෙඩ් එකක වෙනස් කළ හැකිය ). try/exceptහෝ ධාවන තත්ත්වය වළක්වා ගැනීම සඳහා අගුල් භාවිතා කළ හැකිය.
jfs

7
@JFSebastian නූල් අතර ලැයිස්තුවක් බෙදාගෙන ඔබ විවේචනාත්මක කොටස් යොදන්නේ නැත්නම් ඔබට විශාල ගැටළු තිබේ.
ගුස්ඩෝර්

4
Us ගුස්ඩෝර්, පයිතොනික් මෝඩය යනු පරීක්ෂා නොකර උත්සාහ කර ව්‍යතිරේකය සිදුවුවහොත් එය අල්ලා ගැනීමයි. එය වඩා කාර්යක්ෂම වේ (දෙකක් වෙනුවට එක් බැල්මක් පමණි), ටිකක් කැත වුවත්
ජීට්

81

ඔබට කළ හැකිය

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

නමුත් ඉහත ලැයිස්තුවේ 6 වතාවක් සෙවීමට 2 වතාවක් අවශ්‍ය වේ, එබැවින් වේගවත් වීමට හැර උත්සාහ කරන්න

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
LaOlafDietsche Python 3.x හි, එය පෙරහන් වස්තුවක් ලබා දෙයි (2.x හි, එය ලැයිස්තුවක් ලබා දෙයි), එබැවින් කිසියම් ක්‍රියාකාරීත්වයක් ඇති කර ගැනීම සඳහා මට "a" ලැයිස්තුවකට දැමිය යුතුය.
mathwizurd

17

එය ස්ථානගතව කරන්නේ කෙසේද යන්න මෙන්න (ලැයිස්තු අවබෝධය නොමැතිව):

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

ඉතා දක්ෂයි - මම මේකට ඇත්තටම කැමතියි - අවාසනාවකට එය වඩාත්ම ජනප්‍රිය පිළිතුර තරම් අකාර්යක්ෂම බව පෙනේ. යෝධ ලැයිස්තු සඳහා ගිල්ගේ විසඳුම සැබවින්ම වඩා වේගවත් වන්නේ ඔබ ඉවත් කිරීමට බලාපොරොත්තු වන වටිනාකමේ අවස්ථා කිහිපයක් පමණි.
ලාරෝල්ඩ්

1
Ara ලාරෝල්ඩ් වේගවත්ම ක්‍රමය වෙනම ප්‍රශ්නයක් වනු ඇත. මගේ මුදල් පොදු නඩුවේ ලැයිස්තු අවබෝධය මත ඇත. ආදාන ලැයිස්තුවේ අගය නිතර නිතර සිදුවන අතර ලැයිස්තු අවබෝධය භාවිතා නොකරන්නේ නම් මෙම විසඳුම ඉතා හොඳින් ක්‍රියාත්මක විය යුතුය. Cython හි Pypy, numpy දත්ත උත්සාහ කරන්න. [@ ගිල්ගේ පිළිතුර O(n*n)අනවශ්‍ය ලෙස (1e6 සහ 1e12 සංසන්දනය කරන්න - ඔබට දෙවැන්න අවදානමට ලක් කිරීමට අවශ්‍ය නැත). while 1: L.remove(value)නැවත පැමිණීම CPython හි s හෝ කුඩා ලැයිස්තු ValueErrorකිහිපයක් සමඟ හොඳින් ක්‍රියා කරයි value.
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:ලූප් ව්‍යුහය ලෙස භාවිතා නොකරන්නේ ඇයි ?
TerminalDilettante

13
O(n^2)අවබෝධයක් ඇති තැන මෙයයි O(n).
පිස්සු භෞතික විද්‍යා

1
ඇත්ත වශයෙන්ම adMadPhysicist හරි, සහ TerminalDilettante හි අනුවාදය අපි කාර්ය සාධනය ගැන තැකීමක් නොකළත් තවත් බොහෝ පයිතොනික් වේ. 2013 මම දැන් පයිතන් ඉගෙන ගැනීමට පටන් ගත් අතර වර්තමානයේ මම එවකට ලියා ඇති දේ ගැන බොහෝ විට ලැජ්ජා වෙමි.
gil

11

ඔබේ යෙදුමට කට්ටලයක් අදාළ වන්නේ නම්, ලැයිස්තුවක් වෙනුවට කට්ටලයක් භාවිතා කිරීම තවත් හැකියාවක් වේ.

IE ඔබේ දත්ත ඇණවුම් කර නොමැති නම් සහ අනුපිටපත් නොමැති නම්

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

දෝෂ රහිත ය.

බොහෝ විට ලැයිස්තුවක් යනු පිළිවෙලට පිළිවෙලට නැති අයිතම සඳහා පහසු බහාලුමක් පමණි. මූලද්‍රව්‍යයක සියලුම සිදුවීම් ලැයිස්තුවකින් ඉවත් කරන්නේ කෙසේදැයි අසන ප්‍රශ්න තිබේ. ඔබට මුලින් අනුපිටපත් අවශ්‍ය නැතිනම්, නැවත වරක් කට්ටලයක් පහසුය.

my_set.add(3)

ඉහළින් my_set වෙනස් නොකරයි.


10

වෙනත් බොහෝ පිළිතුරු වලින් ප්‍රකාශ කර ඇති පරිදි, ක්‍රියා list.remove()කරනු ඇත, නමුත් ValueErrorඅයිතමය ලැයිස්තුවේ නොතිබුනේ නම් විසි කරන්න . භාවිතා, පිඹුරා 3.4+ සමග, මේ සම්බන්ධයෙන් කටයුතු කිරීමට සිත්ගන්නා ප්රවේශය තියෙන්නේ මැඩීමට contextmanager :

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

9

ඔබේ මූලද්‍රව්‍ය එකිනෙකට වෙනස් නම්, සරල කට්ටල වෙනසක් සිදු කරයි.

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]

3
ඔබේ අංග එකිනෙකට වෙනස් නම් සහ ඔබ ඇණවුම ගැන තැකීමක් නොකරන්නේ නම් .
ටොම් සයික්

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]

3
ඔබ මෙය නම්, ඔබ ඇත්තටම පමණක් විය යුතු breakමත except ValueError.
ඇන්තන්


3

ඔබ ඉවත් කිරීමට බලාපොරොත්තු වන අංග හැර සියල්ල සුචිගත කිරීමෙන් ලැයිස්තුව නැවත ලියන්න

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

වඩාත් පොදුවේ,

>>> s = [5,4,3,2,1]
>>> i = s.index(3)
>>> s[:i] + s[i+1:]
[5, 4, 2, 1]

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

සඳහා පුඩුවක් සහ කොන්දේසියක් සමඟ:

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]

මෙය උපකාරී වේ යැයි සිතමි. PS, ආයාචනය කරන්න මෙය 3.6.2 අනුවාදයේ ලියා ඇති බැවින් පැරණි අනුවාද සඳහා එය සකස් කිරීමට ඔබට අවශ්‍ය විය හැකිය.


පොදුවේ ගත් කල, ලැයිස්තු-අවබෝධය අතුරු ආබාධ සඳහා පමණක් භාවිතා නොකළ යුතුය, මේ අවස්ථාවේ දී - වෙනත් ලැයිස්තුවකින් මූලද්‍රව්‍ය ඉවත් කිරීම. සාමාන්‍ය ලූපයක් භාවිතා කිරීම සහ අනවශ්‍ය අමතර ලැයිස්තු නිර්මාණය කිරීමෙන් වැළකී සිටීම වඩා හොඳය
ටොමරිකෝ

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

0

සමහර විට ඔබේ විසඳුම් ints සමඟ ක්‍රියා කරයි, නමුත් එය මට ශබ්ද කෝෂ සමඟ ක්‍රියා නොකරයි.

එක් අතකින්, ඉවත් කරන්න () මා වෙනුවෙන් වැඩ කර නැත. නමුත් සමහර විට එය මූලික වර්ග සමඟ ක්‍රියා කරයි. වස්තු ලැයිස්තුවෙන් අයිතම ඉවත් කිරීමේ ක්‍රමය ද කේත බෙලෝ බව මම අනුමාන කරමි.

අනෙක් අතට, 'ඩෙල්' නිසි ලෙස ක්‍රියා කර නැත. මගේ නඩුවේදී, පයිතන් 3.6 භාවිතා කිරීම: ඩෙල් විධාන සමඟ 'සඳහා' බකල් එකක ලැයිස්තුවකින් මූලද්‍රව්‍යයක් මකා දැමීමට උත්සාහ කරන විට, පයිතන් ක්‍රියාවලියේ දර්ශකය වෙනස් කරන අතර කාලයට පෙර බකල් අකාලයේ නතර වේ. එය ක්‍රියාත්මක වන්නේ ඔබ මූලද්‍රව්‍යය මූලද්‍රව්‍යය ප්‍රතිලෝම අනුපිළිවෙලින් මකා දැමුවහොත් පමණි . මේ ආකාරයට ඔබ අපේක්ෂිත මූලද්‍රව්‍ය අරාව දර්ශකය හරහා ගමන් කරන විට එය වෙනස් නොකරයි

එවිට, මම භාවිතා කළේ:

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

එහිදී 'ලැයිස්තුව' [key 'key1': value1 '}, key' key2 ': value2}, key' key3 ': value3}, ...]

ගණන් ගැනීමේදී ඔබට තවත් පයිතොනික් කළ හැකිය:

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

-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()
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.