Nếu a mydict
không trống, tôi truy cập một phần tử tùy ý là:
mydict[mydict.keys()[0]]
Có cách nào tốt hơn để làm điều này?
list(mydict.keys())[0]
.
Nếu a mydict
không trống, tôi truy cập một phần tử tùy ý là:
mydict[mydict.keys()[0]]
Có cách nào tốt hơn để làm điều này?
list(mydict.keys())[0]
.
Câu trả lời:
Trên Python 3, không phá hủy và lặp lại:
next(iter(mydict.values()))
Trên Python 2, không phá hủy và lặp lại:
mydict.itervalues().next()
Nếu bạn muốn nó hoạt động trong cả Python 2 và 3, bạn có thể sử dụng six
gói:
six.next(six.itervalues(mydict))
mặc dù tại thời điểm này nó khá khó hiểu và tôi thích mã của bạn hơn.
Nếu bạn muốn xóa bất kỳ mục nào, hãy làm:
key, value = mydict.popitem()
Lưu ý rằng "đầu tiên" có thể không phải là một thuật ngữ thích hợp ở đây vì dict
không phải là loại có thứ tự trong Python <3.6. Python 3.6+ dicts
được đặt hàng.
dict.iterkeys().next()
sao?
dict.values().__iter__().__next__()
:)
key, value = dict(d).popitem()
Nếu bạn chỉ cần truy cập một yếu tố (là người đầu tiên tình cờ, vì các điều khoản không đảm bảo việc đặt hàng), bạn có thể chỉ cần làm điều này trong 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
Xin lưu ý rằng (theo hiểu biết của tôi) Python không đảm bảo rằng 2 cuộc gọi liên tiếp đến bất kỳ phương thức nào trong số này sẽ trả về danh sách với cùng một thứ tự. Điều này không được hỗ trợ với Python3.
trong 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]
là không lười biếng?
Trong python3, Cách:
dict.keys()
trả về một giá trị theo loại: dict_keys (), chúng tôi sẽ gặp lỗi khi có thành viên thứ nhất của khóa dict theo cách này:
dict.keys()[0]
TypeError: 'dict_keys' object does not support indexing
Cuối cùng, tôi chuyển đổi dict.keys () thành list @ 1st và có thành viên thứ 1 theo phương thức splice danh sách:
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
Hai cái đầu tiên là Python 2 và 3. Hai cái cuối cùng lười biếng trong Python 3, nhưng không phải trong Python 2.
Như những người khác đã đề cập, không có "mục đầu tiên", vì từ điển không có thứ tự được đảm bảo (chúng được thực hiện dưới dạng bảng băm). Nếu bạn muốn, ví dụ, giá trị tương ứng với khóa nhỏ nhất, thedict[min(thedict)]
sẽ làm điều đó. Nếu bạn quan tâm đến thứ tự các phím được chèn, tức là, "đầu tiên", bạn có nghĩa là "được chèn sớm nhất", thì trong Python 3.1, bạn có thể sử dụng các bộ sưu tập.OrderedDict , cũng nằm trong Python 2.7 sắp tới; đối với các phiên bản cũ hơn của Python, hãy tải xuống, cài đặt và sử dụng backport dict được đặt hàng (2.4 trở lên) mà bạn có thể tìm thấy ở đây .
Python 3.7 Bây giờ các lệnh được chèn theo thứ tự.
Còn cái này thì sao. Chưa được đề cập ở đây.
py 2 & 3
a = {"a":2,"b":3}
a[list(a)[0]] # the first element is here
>>> 2
dict.values()
trả về một khung nhìn, vì vậy nên là O (1). list(a)
trả về một danh sách mới, vì vậy sẽ là O (n).
Bỏ qua các vấn đề xung quanh việc đặt hàng chính tả, điều này có thể tốt hơn:
next(dict.itervalues())
Bằng cách này, chúng tôi tránh tra cứu mục và tạo danh sách các khóa mà chúng tôi không sử dụng.
next(iter(dict.values()))
next(iter(dict.values()))
nhận được kết quả tương tự mà không cần tạo danh sách.
Bạn luôn có thể làm:
for k in sorted(d.keys()):
print d[k]
Điều này sẽ cung cấp cho bạn một sự sắp xếp nhất quán (liên quan đến nội dung dung .hash () tôi đoán) mà bạn có thể xử lý nếu việc sắp xếp có ý nghĩa gì với bạn. Điều đó có nghĩa là các loại số ví dụ được sắp xếp một cách nhất quán ngay cả khi bạn mở rộng từ điển.
THÍ DỤ
# 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())
Lưu ý rằng từ điển được sắp xếp khi in. Nhưng bộ khóa về cơ bản là một hashmap!
Đối với cả Python 2 và 3:
import six
six.next(six.itervalues(d))
Is there any better way to do this?
theo cách ngắn gọn.
first_key, *rest_keys = mydict
Không có thư viện bên ngoài, hoạt động trên cả Python 2.7 và 3.x:
>>> list(set({"a":1, "b": 2}.values()))[0]
1
Đối với khóa aribtrary chỉ cần bỏ qua .values ()
>>> list(set({"a":1, "b": 2}))[0]
'a'
Phân lớp dict
là một phương thức, mặc dù không hiệu quả. Ở đây nếu bạn cung cấp một số nguyên, nó sẽ trả về d[list(d)[n]]
, nếu không thì truy cập từ điển như mong đợi:
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'