หาก a mydict
ไม่ว่างเปล่าฉันจะเข้าถึงองค์ประกอบตามอำเภอใจดังนี้:
mydict[mydict.keys()[0]]
มีวิธีที่ดีกว่าในการทำเช่นนี้?
list(mydict.keys())[0]
คุณต้องโยนไปที่รายการ:
หาก a mydict
ไม่ว่างเปล่าฉันจะเข้าถึงองค์ประกอบตามอำเภอใจดังนี้:
mydict[mydict.keys()[0]]
มีวิธีที่ดีกว่าในการทำเช่นนี้?
list(mydict.keys())[0]
คุณต้องโยนไปที่รายการ:
คำตอบ:
บน Python 3 แบบไม่ทำลายและวนซ้ำ:
next(iter(mydict.values()))
บน Python 2 แบบไม่ทำลายและวนซ้ำ:
mydict.itervalues().next()
ถ้าคุณต้องการให้มันทำงานได้ทั้ง Python 2 และ 3 คุณสามารถใช้six
แพ็คเกจได้:
six.next(six.itervalues(mydict))
แม้ว่า ณ จุดนี้มันค่อนข้างคลุมเครือและฉันต้องการรหัสของคุณมากกว่า
หากคุณต้องการลบรายการใด ๆ ให้ทำ:
key, value = mydict.popitem()
โปรดทราบว่า "ครั้งแรก" อาจไม่ใช่คำที่เหมาะสมที่นี่เพราะdict
ไม่ใช่ประเภทที่สั่งซื้อใน Python <3.6 dicts
สั่งPython 3.6+
dict.iterkeys().next()
เหรอ
dict.values().__iter__().__next__()
:)
key, value = dict(d).popitem()
หากคุณต้องการเข้าถึงองค์ประกอบเดียว (เป็นคนแรกโดยบังเอิญเนื่องจาก dicts ไม่รับประกันการสั่งซื้อ) คุณสามารถทำได้ในPython 2 :
my_dict.keys()[0] -> key of "first" element
my_dict.values()[0] -> value of "first" element
my_dict.items()[0] -> (key, value) tuple of "first" element
โปรดทราบว่า (อย่างดีที่สุดจากความรู้ของฉัน) Python ไม่รับประกันว่าการโทรติดต่อ 2 ครั้งต่อเนื่องไปยังวิธีการใด ๆ เหล่านี้จะส่งคืนรายการที่มีลำดับเดียวกัน สิ่งนี้ไม่รองรับกับ Python3
ในPython 3 :
list(my_dict.keys())[0] -> key of "first" element
list(my_dict.values())[0] -> value of "first" element
list(my_dict.items())[0] -> (key, value) tuple of "first" element
list(my_dict.keys())[0]
list(my_dict.keys())[0]
ไม่ขี้เกียจ?
ใน python3 วิธี:
dict.keys()
คืนค่าในรูปแบบ: dict_keys () เราจะพบข้อผิดพลาดเมื่อมีสมาชิกคนที่ 1 ของคีย์ dict ด้วยวิธีนี้:
dict.keys()[0]
TypeError: 'dict_keys' object does not support indexing
สุดท้ายฉันแปลง dict.keys () เป็น list @ 1st และได้สมาชิกที่ 1 โดยวิธีการต่อรายการ:
list(dict.keys())[0]
list(dict.values())[0]
ได้
next(iter(mydict))
next(iter(mydict.values()))
next(iter(mydict.items())) # or next(iter(mydict.viewitems())) in python 2
สองคนแรกคือ Python 2 และ 3 สองคนสุดท้ายเป็นคนขี้เกียจใน Python 3 แต่ไม่ใช่ใน Python 2
ดังที่คนอื่น ๆ กล่าวถึงไม่มี "รายการแรก" เนื่องจากพจนานุกรมไม่มีคำสั่งซื้อที่รับประกัน (มีการใช้งานเป็นตารางแฮช) ตัวอย่างเช่นหากคุณต้องการค่าที่สอดคล้องกับคีย์ที่เล็กที่สุดthedict[min(thedict)]
จะทำเช่นนั้น หากคุณสนใจลำดับที่ใส่กุญแจนั่นคือ "แรก" คุณหมายถึง "แทรกเร็ว" จากนั้นใน Python 3.1 คุณสามารถใช้คอลเลกชัน OrderedDictซึ่งอยู่ใน Python 2.7 ที่กำลังจะมาถึง สำหรับรุ่นเก่าของงูหลามดาวน์โหลดติดตั้งและใช้ย้ายกลับ Dict สั่งซื้อ (2.4 และต่อมา) ซึ่งคุณสามารถหาได้ที่นี่
Python 3.7 ตอนนี้ใส่ dicts แล้ว
การเพิกเฉยปัญหาที่เกิดขึ้นโดยรอบการสั่งซื้อแบบคิดเลขอาจจะดีกว่า:
next(dict.itervalues())
วิธีนี้เราหลีกเลี่ยงการค้นหารายการและสร้างรายการของคีย์ที่เราไม่ได้ใช้
next(iter(dict.values()))
next(iter(dict.values()))
ได้ผลลัพธ์เดียวกันโดยไม่ต้องสร้างรายการ
ใน python3
list(dict.values())[0]
คุณสามารถทำได้:
for k in sorted(d.keys()):
print d[k]
สิ่งนี้จะทำให้คุณได้รับการเรียงลำดับอย่างต่อเนื่อง (เทียบกับbuiltin .hash () ฉันเดา) ชุดของคีย์ที่คุณสามารถดำเนินการได้หากการเรียงลำดับมีความหมายใด ๆ กับคุณ นั่นหมายความว่าตัวอย่างประเภทตัวเลขจะถูกจัดเรียงอย่างสม่ำเสมอแม้ว่าคุณจะขยายพจนานุกรม
ตัวอย่าง
# lets create a simple dictionary
d = {1:1, 2:2, 3:3, 4:4, 10:10, 100:100}
print d.keys()
print sorted(d.keys())
# add some other stuff
d['peter'] = 'peter'
d['parker'] = 'parker'
print d.keys()
print sorted(d.keys())
# some more stuff, numeric of different type, this will "mess up" the keys set order
d[0.001] = 0.001
d[3.14] = 'pie'
d[2.71] = 'apple pie'
print d.keys()
print sorted(d.keys())
โปรดทราบว่าพจนานุกรมจะถูกจัดเรียงเมื่อพิมพ์ แต่ชุดคีย์คือ hashmap เป็นหลัก!
สำหรับ Python 2 และ 3:
import six
six.next(six.itervalues(d))
Is there any better way to do this?
ในลักษณะสั้น ๆ
first_key, *rest_keys = mydict
ไม่มีไลบรารีภายนอกทำงานได้ทั้ง Python 2.7 และ 3.x:
>>> list(set({"a":1, "b": 2}.values()))[0]
1
สำหรับคีย์ Aribtrary เพียงแค่ปล่อย. value ()
>>> list(set({"a":1, "b": 2}))[0]
'a'
การจัดคลาสย่อยdict
เป็นวิธีหนึ่ง แต่ไม่มีประสิทธิภาพ ที่นี่หากคุณระบุจำนวนเต็มมันจะกลับมาd[list(d)[n]]
มิฉะนั้นเข้าถึงพจนานุกรมตามที่คาดไว้:
class mydict(dict):
def __getitem__(self, value):
if isinstance(value, int):
return self.get(list(self)[value])
else:
return self.get(value)
d = mydict({'a': 'hello', 'b': 'this', 'c': 'is', 'd': 'a',
'e': 'test', 'f': 'dictionary', 'g': 'testing'})
d[0] # 'hello'
d[1] # 'this'
d['c'] # 'is'