เมื่อลบคีย์ออกจากพจนานุกรมฉันใช้:
if 'key' in my_dict:
del my_dict['key']
มีวิธีหนึ่งในการทำเช่นนี้?
เมื่อลบคีย์ออกจากพจนานุกรมฉันใช้:
if 'key' in my_dict:
del my_dict['key']
มีวิธีหนึ่งในการทำเช่นนี้?
คำตอบ:
หากต้องการลบคีย์โดยไม่คำนึงว่าอยู่ในพจนานุกรมหรือไม่ให้ใช้รูปแบบสองอาร์กิวเมนต์ของdict.pop()
:
my_dict.pop('key', None)
สิ่งนี้จะกลับมาmy_dict[key]
หากkey
มีอยู่ในพจนานุกรมและNone
อื่น ๆ หากไม่ได้ระบุพารามิเตอร์ที่สอง (เช่น. my_dict.pop('key')
) และkey
ไม่มีอยู่KeyError
จะมีการยกระดับ
หากต้องการลบคีย์ที่รับประกันว่ามีอยู่คุณสามารถใช้
del my_dict['key']
นี่จะเป็นการเพิ่ม a KeyError
หากคีย์ไม่ได้อยู่ในพจนานุกรม
pop()
เกินdel
: มันส่งคืนค่าสำหรับคีย์นั้น วิธีนี้คุณสามารถรับและลบรายการจาก dict ในบรรทัดเดียว
try
/ except
วิธีแก้ปัญหาหากไม่มีคีย์ คุณอาจพบว่าอ่านอย่างใดอย่างหนึ่งได้ง่ายขึ้นซึ่งก็ดี ทั้งคู่เป็น Python ที่ใช้สำนวนดังนั้นเลือกสิ่งที่คุณต้องการ แต่การอ้างว่าคำตอบนี้ซับซ้อนหรือไม่มีประสิทธิภาพก็ไม่สมเหตุสมผล
self
ดังนั้นจึงค่อนข้างน่าแปลกใจถ้าวิธีนี้ทำ
คำตอบเฉพาะ "มีวิธีหนึ่งในการทำเช่นนี้หรือไม่?"
if 'key' in my_dict: del my_dict['key']
... ดีคุณถาม ;-)
คุณควรพิจารณาได้ว่าวิธีการลบวัตถุจากหนึ่งนี้dict
คือไม่อะตอม -IT เป็นไปได้ว่า'key'
อาจจะอยู่ในmy_dict
ระหว่างif
คำสั่ง แต่อาจถูกลบออกก่อนที่del
จะดำเนินการในกรณีที่จะล้มเหลวด้วยdel
KeyError
ป.ร. ให้ไว้ ณ ที่นี้มันจะปลอดภัยที่สุดที่จะใช้dict.pop
หรือบางสิ่งบางอย่างตามแนวของ
try:
del my_dict['key']
except KeyError:
pass
ซึ่งแน่นอนไม่แน่นอนหนึ่งซับ
pop
เป็นข้อสรุปที่แน่นอนมากขึ้นแม้ว่าจะมีข้อได้เปรียบที่สำคัญข้อหนึ่งในการทำเช่นนี้: มันชัดเจนทันทีว่าทำอะไรอยู่
try/except
คำสั่งที่มีราคาแพงมากขึ้น การเพิ่มข้อยกเว้นช้า
try
ก็เร็วกว่าเล็กน้อยแม้ว่ามันจะไม่ได้try
ก็ตาม pop
ค่อนข้างสอดคล้อง แต่ช้ากว่าทั้งหมด แต่try
ใช้รหัสที่ไม่ปรากฏ ดูgist.github.com/zigg/6280653 ท้ายที่สุดมันขึ้นอยู่กับความถี่ที่คุณคาดหวังว่ากุญแจจะอยู่ในพจนานุกรมหรือไม่และคุณต้องการอะตอมมิกหรือไม่และแน่นอนว่าคุณมีส่วนร่วมในการปรับให้เหมาะสมก่อนกำหนดหรือไม่?
if 'key' in mydict: #then del...
ยกเว้นคุณยังสามารถไป ฉันต้องการดึงคีย์ / วาลจาก dict เพื่อแยกอย่างถูกต้องป๊อปไม่ใช่โซลูชันที่สมบูรณ์แบบ
ฉันใช้เวลาพอจะเข้าใจว่าmy_dict.pop("key", None)
กำลังทำอะไรอยู่ ดังนั้นฉันจะเพิ่มนี่เป็นคำตอบเพื่อประหยัดเวลาผู้ใช้ Google:
pop(key[, default])
หากที่สำคัญคือในพจนานุกรมเอามันและส่งกลับค่าอื่นกลับมาเริ่มต้น หากไม่ได้กำหนดค่าเริ่มต้นและรหัสไม่ได้อยู่ในพจนานุกรม
KeyError
จะมีการยกระดับขึ้น
dict.pop?
ใน IPython
del my_dict[key]
เร็วกว่าmy_dict.pop(key)
การลบคีย์ออกจากพจนานุกรมเล็กน้อยเมื่อมีคีย์อยู่
>>> import timeit
>>> setup = "d = {i: i for i in range(100000)}"
>>> timeit.timeit("del d[3]", setup=setup, number=1)
1.79e-06
>>> timeit.timeit("d.pop(3)", setup=setup, number=1)
2.09e-06
>>> timeit.timeit("d2 = {key: val for key, val in d.items() if key != 3}", setup=setup, number=1)
0.00786
แต่เมื่อที่สำคัญไม่ได้อยู่ที่จะเร็วกว่าเล็กน้อยif key in my_dict: del my_dict[key]
my_dict.pop(key, None)
ทั้งสองอย่างนี้เร็วกว่าสามครั้งdel
ใน a try
/ except
statement:
>>> timeit.timeit("if 'missing key' in d: del d['missing key']", setup=setup)
0.0229
>>> timeit.timeit("d.pop('missing key', None)", setup=setup)
0.0426
>>> try_except = """
... try:
... del d['missing key']
... except KeyError:
... pass
... """
>>> timeit.timeit(try_except, setup=setup)
0.133
pop
del
การสร้างพจนานุกรมจะแคระการลบสิ่งต่าง ๆ อย่างสมบูรณ์
del
และpop
จากการตั้งเวลาครั้งแรกด้านบน)
หากคุณต้องการลบคีย์จำนวนมากออกจากพจนานุกรมในรหัสหนึ่งบรรทัดฉันคิดว่าการใช้ map () ค่อนข้างสั้นและสามารถอ่าน Pythonic ได้:
myDict = {'a':1,'b':2,'c':3,'d':4}
map(myDict.pop, ['a','c']) # The list of keys to remove
>>> myDict
{'b': 2, 'd': 4}
และหากคุณต้องการตรวจจับข้อผิดพลาดที่คุณเติมค่าที่ไม่ได้อยู่ในพจนานุกรมให้ใช้แลมบ์ดาในแผนที่ () ดังนี้:
map(lambda x: myDict.pop(x,None), ['a', 'c', 'e'])
[1, 3, None] # pop returns
>>> myDict
{'b': 2, 'd': 4}
หรือในpython3
คุณต้องใช้รายการความเข้าใจแทน:
[myDict.pop(x, None) for x in ['a', 'c', 'e']]
มันได้ผล. และ 'e' ไม่ได้ทำให้เกิดข้อผิดพลาดแม้ว่า myDict จะไม่มีรหัส 'e'
map
ตอนนี้เพื่อน ๆ ขี้เกียจแล้วก็ส่งคืนตัววนซ้ำ การใช้map
ผลข้างเคียงโดยทั่วไปถือว่าแย่ for ... in
ห่วงมาตรฐานจะดีกว่า ดูการดูและการวนซ้ำแทนรายการสำหรับข้อมูลเพิ่มเติม
[myDict.pop(i, None) for i in ['a', 'c']]
เนื่องจากเป็นทางเลือกทั่วไปสำหรับmap
(และfilter
)
for ... in
ลูปปกติ
map()
เฉพาะซึ่งมักใช้กับผลข้างเคียง ทางเลือกที่แนะนำใน Python คือความเข้าใจในรายการซึ่งในความคิดของฉันยังอ่านได้ค่อนข้างเบาและมีความรู้ความเข้าใจในฐานะหนึ่งซับ (ดูคำถาม) ใช้สำหรับผลข้างเคียงเท่านั้นทั้งคู่สร้างผลลัพธ์ในรายการที่ไร้ประโยชน์ซึ่งอาจไม่มีประสิทธิภาพ ในฐานะของ Python3 loop(d.pop(k) for k in ['a', 'b'])
ผมไม่ได้ตระหนักถึงในตัวฟังก์ชั่นที่สามารถได้อย่างปลอดภัยและสวยงามย้ำผ่านการแสดงออกเครื่องกำเนิดไฟฟ้าโดยไม่ต้องเสียค่าใช้จ่ายผลพลอยได้เช่น
คุณสามารถใช้ความเข้าใจในพจนานุกรมเพื่อสร้างพจนานุกรมใหม่โดยลบคีย์นั้น:
>>> my_dict = {k: v for k, v in my_dict.items() if k != 'key'}
คุณสามารถลบได้ตามเงื่อนไข ไม่มีข้อผิดพลาดหากkey
ไม่มีอยู่
การใช้คำหลัก "del":
del dict[key]
เราสามารถลบคีย์ออกจากพจนานุกรม Python ได้ด้วยวิธีการต่อไปนี้
ใช้del
คำหลัก; มันเกือบจะเป็นวิธีเดียวกันกับที่คุณทำ -
myDict = {'one': 100, 'two': 200, 'three': 300 }
print(myDict) # {'one': 100, 'two': 200, 'three': 300}
if myDict.get('one') : del myDict['one']
print(myDict) # {'two': 200, 'three': 300}
หรือ
เราสามารถทำสิ่งต่อไปนี้:
แต่เราควรจำไว้ว่าในกระบวนการนี้จริง ๆ แล้วมันจะไม่ลบคีย์ใด ๆ จากพจนานุกรมแทนที่จะสร้างคีย์เฉพาะที่แยกออกจากพจนานุกรมนั้น myDict
นอกจากนี้ผมสังเกตเห็นว่ามันกลับพจนานุกรมซึ่งไม่ได้รับคำสั่งเช่นเดียวกับ
myDict = {'one': 100, 'two': 200, 'three': 300, 'four': 400, 'five': 500}
{key:value for key, value in myDict.items() if key != 'one'}
ถ้าเราใช้มันในเปลือกก็จะดำเนินการบางอย่างเช่น{'five': 500, 'four': 400, 'three': 300, 'two': 200}
- myDict
แจ้งให้ทราบว่ามันเป็นไม่เหมือนกันสั่ง ถ้าเราลองพิมพ์อีกครั้งmyDict
เราจะเห็นปุ่มทั้งหมดรวมถึงที่เราแยกออกจากพจนานุกรมด้วยวิธีการนี้ อย่างไรก็ตามเราสามารถสร้างพจนานุกรมใหม่โดยกำหนดคำสั่งต่อไปนี้ลงในตัวแปร:
var = {key:value for key, value in myDict.items() if key != 'one'}
ตอนนี้ถ้าเราพยายามที่จะพิมพ์มันก็จะทำตามคำสั่งของผู้ปกครอง:
print(var) # {'two': 200, 'three': 300, 'four': 400, 'five': 500}
หรือ
ใช้pop()
วิธีการ
myDict = {'one': 100, 'two': 200, 'three': 300}
print(myDict)
if myDict.get('one') : myDict.pop('one')
print(myDict) # {'two': 200, 'three': 300}
ความแตกต่างระหว่างdel
กับpop
คือว่าโดยใช้pop()
วิธีการเราสามารถจัดเก็บค่าของคีย์ถ้าจำเป็นเช่นต่อไปนี้:
myDict = {'one': 100, 'two': 200, 'three': 300}
if myDict.get('one') : var = myDict.pop('one')
print(myDict) # {'two': 200, 'three': 300}
print(var) # 100
แยกส่วนสำคัญนี้เพื่อใช้อ้างอิงในอนาคตหากคุณพบว่ามีประโยชน์
if myDict.get('one')
เพื่อตรวจสอบว่ามีกุญแจอยู่หรือไม่! มันจะล้มเหลวหาก myDict ['one'] มีค่าที่ไม่ถูกต้อง นอกจากนี้ dicts ไม่มีลำดับโดยธรรมชาติดังนั้นจึงไม่มีความเหมาะสมที่จะพูดถึง
คุณสามารถใช้การจัดการข้อยกเว้นถ้าคุณต้องการที่จะ verbose มาก:
try:
del dict[key]
except KeyError: pass
สิ่งนี้ช้าลงกว่าpop()
วิธีหากคีย์ไม่มีอยู่
my_dict.pop('key', None)
มันจะไม่สำคัญกับคีย์สองสามปุ่ม แต่ถ้าคุณทำสิ่งนี้ซ้ำ ๆ วิธีหลังเป็นวิธีที่ดีกว่า
วิธีที่เร็วที่สุดคือ:
if 'key' in dict:
del myDict['key']
แต่วิธีการนี้เป็นอันตรายเพราะถ้า'key'
ถูกลบระหว่างสองบรรทัดKeyError
จะเพิ่มขึ้น
ฉันชอบเวอร์ชั่นที่ไม่เปลี่ยนรูป
foo = {
1:1,
2:2,
3:3
}
removeKeys = [1,2]
def woKeys(dct, keyIter):
return {
k:v
for k,v in dct.items() if k not in keyIter
}
>>> print(woKeys(foo, removeKeys))
{3: 3}
>>> print(foo)
{1: 1, 2: 2, 3: 3}
อีกวิธีคือการใช้ items () + dict comprehension
items () ควบคู่ไปกับความเข้าใจ dict ยังสามารถช่วยให้เราบรรลุภารกิจการลบคู่คีย์ - ค่า แต่มันมีข้อเสียเปรียบที่ไม่ใช่เทคนิค dict แบบ inplace จริงแล้วเป็น dict ใหม่หากสร้างขึ้นยกเว้นคีย์ที่เราไม่ต้องการรวมไว้
test_dict = {"sai" : 22, "kiran" : 21, "vinod" : 21, "sangam" : 21}
# Printing dictionary before removal
print ("dictionary before performing remove is : " + str(test_dict))
# Using items() + dict comprehension to remove a dict. pair
# removes vinod
new_dict = {key:val for key, val in test_dict.items() if key != 'vinod'}
# Printing dictionary after removal
print ("dictionary after remove is : " + str(new_dict))
เอาท์พุท:
dictionary before performing remove is : {'sai': 22, 'kiran': 21, 'vinod': 21, 'sangam': 21}
dictionary after remove is : {'sai': 22, 'kiran': 21, 'sangam': 21}
สิ่งนี้จะเปลี่ยนแปลง
my_dict
ในสถานที่ (ไม่แน่นอน)
my_dict.pop('key', None)
สร้าง dict ใหม่ (ไม่เปลี่ยนรูป)
dic1 = {
"x":1,
"y": 2,
"z": 3
}
def func1(item):
return item[0]!= "x" and item[0] != "y"
print(
dict(
filter(
lambda item: item[0] != "x" and item[0] != "y",
dic1.items()
)
)
)