Hướng dẫn can a dictionary be a key in python? - từ điển có thể là chìa khóa trong python không?

Tên lớp ... ok:/

Giải pháp của tôi là tạo một lớp, với các tính năng Dict, nhưng được triển khai như một danh sách với các đối tượng

dad = {"name": "dad"}
mom = {"name": "mom"}
boy = {"name": "son"}
girl = {"name": "daughter"}

# set
family = DictKeyDict()
family[dad] = {"age": 44}
family[mom] = {"age": 43}
# or
family.set(dad, {"age": 44, "children": [boy, girl]})
# or
family = DictKeyDict(
    (dad, {"age": 44, "children": [boy, girl]}),
    (mom, {"age": 43, "children": [boy, girl]}),
)

# update
family.update((mom, {"age": 33}))  # oups sorry miss /!\ loose my children

family.set({"pet": "cutty"}, "cat")
del family[{"pet": "cutty"}]  # cutty left...

family.set({"pet": "buddy"}, "dog")
family[{"pet": "buddy"}] = "wolf"  # buddy was not a dog

print(family.keys())
print(family.values())
for k, v in family.items():
    print(k, v)
4. Khóa và giá trị có thể là bất cứ điều gì sau đó.dict features, but implemented as a list with
dad = {"name": "dad"}
mom = {"name": "mom"}
boy = {"name": "son"}
girl = {"name": "daughter"}

# set
family = DictKeyDict()
family[dad] = {"age": 44}
family[mom] = {"age": 43}
# or
family.set(dad, {"age": 44, "children": [boy, girl]})
# or
family = DictKeyDict(
    (dad, {"age": 44, "children": [boy, girl]}),
    (mom, {"age": 43, "children": [boy, girl]}),
)

# update
family.update((mom, {"age": 33}))  # oups sorry miss /!\ loose my children

family.set({"pet": "cutty"}, "cat")
del family[{"pet": "cutty"}]  # cutty left...

family.set({"pet": "buddy"}, "dog")
family[{"pet": "buddy"}] = "wolf"  # buddy was not a dog

print(family.keys())
print(family.values())
for k, v in family.items():
    print(k, v)
4 objects. key and value can be anything then.

class DictKeyDictException(Exception):
    pass


class DictKeyDict():

    def __init__(self, *args):
        values = [self.__create_element(key, value) for key, value in args]
        self.__values__ = values

    def __setitem__(self, key, value):
        self.set(key, value)

    def __getitem__(self, key):
        return self.get(key)

    def __len__(self):
        return len(self.__values__)

    def __delitem__(self, key):
        keys = self.keys()

        if key in keys:
            index = keys.index(key)
            del self.__values__[index]

    def clear(self):
        self.__values__ = []

    def copy(self):
        return self.__values__.copy()

    def has_key(self, k):
        return k in self.keys()

    def update(self, *args, **kwargs):
        if kwargs:
            raise DictKeyDictException(f"no kwargs allowed in '{self.__class__.__name__}.update' method")
        for key, value in args:
            self[key] = value

        return self.__values__

    def __repr__(self) -> list:
        return repr(self.__values__)

    @classmethod
    def __create_element(cls, key, value):
        return {"key": key, "value": value}

    def set(self, key, value) -> None:
        keys = self.keys()

        if key in keys:
            index = keys.index(key)
            self.__values__[index] = self.__create_element(key, value)
        else:
            self.__values__.append(self.__create_element(key, value))

        return self.__values__

    def keys(self):
        return [dict_key_value["key"] for dict_key_value in self.__values__]

    def values(self):
        return [value["value"] for value in self.__values__]

    def items(self):
        return [(dict_key_value["key"], dict_key_value["value"]) for dict_key_value in self.__values__]

    def pop(self, key, default=None):
        keys = self.keys()

        if key in keys:
            index = keys.index(key)
            value = self.__values__.pop(index)["value"]
        else:
            value = default

        return value

    def get(self, key, default=None):
        keys = self.keys()

        if key in keys:
            index = keys.index(key)
            value = self.__values__[index]["value"]
        else:
            value = default

        return value

    def __iter__(self):
        return iter(self.keys())

và cách sử dụng:

dad = {"name": "dad"}
mom = {"name": "mom"}
boy = {"name": "son"}
girl = {"name": "daughter"}

# set
family = DictKeyDict()
family[dad] = {"age": 44}
family[mom] = {"age": 43}
# or
family.set(dad, {"age": 44, "children": [boy, girl]})
# or
family = DictKeyDict(
    (dad, {"age": 44, "children": [boy, girl]}),
    (mom, {"age": 43, "children": [boy, girl]}),
)

# update
family.update((mom, {"age": 33}))  # oups sorry miss /!\ loose my children

family.set({"pet": "cutty"}, "cat")
del family[{"pet": "cutty"}]  # cutty left...

family.set({"pet": "buddy"}, "dog")
family[{"pet": "buddy"}] = "wolf"  # buddy was not a dog

print(family.keys())
print(family.values())
for k, v in family.items():
    print(k, v)


Chúng ta có thể sử dụng số nguyên, chuỗi, bộ dữ liệu làm khóa từ điển nhưng không thể sử dụng danh sách làm khóa của nó.

Khóa từ điển có thể là một chuỗi không?

Các khóa của từ điển có thể là bất kỳ loại bất biến, bao gồm: chuỗi, số và bộ dữ liệu: mydict = {"xin chào": "thế giới", 0: "A", 1: "B", "2": "Không phải là số" (1, 2, 3): "Một tuple!"}

Để truy cập các phần tử từ điển, bạn có thể sử dụng các dấu ngoặc vuông quen thuộc cùng với khóa để có được giá trị của nó. Sau đây là một ví dụ đơn giản -

#!/usr/bin/python

dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}
print "dict['Name']: ", dict['Name']
print "dict['Age']: ", dict['Age']

Khi mã trên được thực thi, nó sẽ tạo ra kết quả sau -

dict['Name']:  Zara
dict['Age']:  7

Nếu chúng tôi cố gắng truy cập một mục dữ liệu bằng khóa, không phải là một phần của từ điển, chúng tôi sẽ gặp lỗi như sau -

#!/usr/bin/python

dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}
print "dict['Alice']: ", dict['Alice']

Khi mã trên được thực thi, nó sẽ tạo ra kết quả sau -

dict['Alice']:
Traceback (most recent call last):
   File "test.py", line 4, in 
      print "dict['Alice']: ", dict['Alice'];
KeyError: 'Alice'

Cập nhật từ điển

Bạn có thể cập nhật từ điển bằng cách thêm một mục nhập mới hoặc một cặp giá trị khóa, sửa đổi một mục nhập hiện có hoặc xóa một mục nhập hiện có như được hiển thị bên dưới trong ví dụ đơn giản-

#!/usr/bin/python

dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}
dict['Age'] = 8; # update existing entry
dict['School'] = "DPS School"; # Add new entry

print "dict['Age']: ", dict['Age']
print "dict['School']: ", dict['School']

Khi mã trên được thực thi, nó sẽ tạo ra kết quả sau -

dict['Age']:  8
dict['School']:  DPS School

Cập nhật từ điển

Bạn có thể cập nhật từ điển bằng cách thêm một mục nhập mới hoặc một cặp giá trị khóa, sửa đổi một mục nhập hiện có hoặc xóa một mục nhập hiện có như được hiển thị bên dưới trong ví dụ đơn giản-

Xóa các yếu tố từ điểndel statement. Following is a simple example −

#!/usr/bin/python

dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}
del dict['Name']; # remove entry with key 'Name'
dict.clear();     # remove all entries in dict
del dict ;        # delete entire dictionary

print "dict['Age']: ", dict['Age']
print "dict['School']: ", dict['School']

Bạn có thể xóa các phần tử từ điển riêng lẻ hoặc xóa toàn bộ nội dung của từ điển. Bạn cũng có thể xóa toàn bộ từ điển trong một thao tác duy nhất.del dict dictionary does not exist any more −

dict['Age']:
Traceback (most recent call last):
   File "test.py", line 8, in 
      print "dict['Age']: ", dict['Age'];
TypeError: 'type' object is unsubscriptable

Để loại bỏ rõ ràng toàn bộ từ điển, chỉ cần sử dụng câu lệnh DEL. Sau đây là một ví dụ đơn giản - − del() method is discussed in subsequent section.

Điều này tạo ra kết quả sau đây. Lưu ý rằng một ngoại lệ được nâng lên vì sau khi Del Dict Dictionary không tồn tại nữa -

Lưu ý - phương thức del () được thảo luận trong phần tiếp theo.

Thuộc tính của khóa từ điển

Giá trị từ điển không có hạn chế. Chúng có thể là bất kỳ đối tượng Python tùy ý nào, đối tượng tiêu chuẩn hoặc đối tượng do người dùng xác định. Tuy nhiên, điều tương tự cũng không đúng với các phím. More than one entry per key not allowed. Which means no duplicate key is allowed. When duplicate keys encountered during assignment, the last assignment wins. For example −

dad = {"name": "dad"}
mom = {"name": "mom"}
boy = {"name": "son"}
girl = {"name": "daughter"}

# set
family = DictKeyDict()
family[dad] = {"age": 44}
family[mom] = {"age": 43}
# or
family.set(dad, {"age": 44, "children": [boy, girl]})
# or
family = DictKeyDict(
    (dad, {"age": 44, "children": [boy, girl]}),
    (mom, {"age": 43, "children": [boy, girl]}),
)

# update
family.update((mom, {"age": 33}))  # oups sorry miss /!\ loose my children

family.set({"pet": "cutty"}, "cat")
del family[{"pet": "cutty"}]  # cutty left...

family.set({"pet": "buddy"}, "dog")
family[{"pet": "buddy"}] = "wolf"  # buddy was not a dog

print(family.keys())
print(family.values())
for k, v in family.items():
    print(k, v)
0

Khi mã trên được thực thi, nó sẽ tạo ra kết quả sau -

dad = {"name": "dad"}
mom = {"name": "mom"}
boy = {"name": "son"}
girl = {"name": "daughter"}

# set
family = DictKeyDict()
family[dad] = {"age": 44}
family[mom] = {"age": 43}
# or
family.set(dad, {"age": 44, "children": [boy, girl]})
# or
family = DictKeyDict(
    (dad, {"age": 44, "children": [boy, girl]}),
    (mom, {"age": 43, "children": [boy, girl]}),
)

# update
family.update((mom, {"age": 33}))  # oups sorry miss /!\ loose my children

family.set({"pet": "cutty"}, "cat")
del family[{"pet": "cutty"}]  # cutty left...

family.set({"pet": "buddy"}, "dog")
family[{"pet": "buddy"}] = "wolf"  # buddy was not a dog

print(family.keys())
print(family.values())
for k, v in family.items():
    print(k, v)
1

Có hai điểm quan trọng cần nhớ về các phím từ điển - Keys must be immutable. Which means you can use strings, numbers or tuples as dictionary keys but something like ['key'] is not allowed. Following is a simple example −

dad = {"name": "dad"}
mom = {"name": "mom"}
boy = {"name": "son"}
girl = {"name": "daughter"}

# set
family = DictKeyDict()
family[dad] = {"age": 44}
family[mom] = {"age": 43}
# or
family.set(dad, {"age": 44, "children": [boy, girl]})
# or
family = DictKeyDict(
    (dad, {"age": 44, "children": [boy, girl]}),
    (mom, {"age": 43, "children": [boy, girl]}),
)

# update
family.update((mom, {"age": 33}))  # oups sorry miss /!\ loose my children

family.set({"pet": "cutty"}, "cat")
del family[{"pet": "cutty"}]  # cutty left...

family.set({"pet": "buddy"}, "dog")
family[{"pet": "buddy"}] = "wolf"  # buddy was not a dog

print(family.keys())
print(family.values())
for k, v in family.items():
    print(k, v)
2

Khi mã trên được thực thi, nó sẽ tạo ra kết quả sau -

dad = {"name": "dad"}
mom = {"name": "mom"}
boy = {"name": "son"}
girl = {"name": "daughter"}

# set
family = DictKeyDict()
family[dad] = {"age": 44}
family[mom] = {"age": 43}
# or
family.set(dad, {"age": 44, "children": [boy, girl]})
# or
family = DictKeyDict(
    (dad, {"age": 44, "children": [boy, girl]}),
    (mom, {"age": 43, "children": [boy, girl]}),
)

# update
family.update((mom, {"age": 33}))  # oups sorry miss /!\ loose my children

family.set({"pet": "cutty"}, "cat")
del family[{"pet": "cutty"}]  # cutty left...

family.set({"pet": "buddy"}, "dog")
family[{"pet": "buddy"}] = "wolf"  # buddy was not a dog

print(family.keys())
print(family.values())
for k, v in family.items():
    print(k, v)
3

(a) Không được phép vào một mục nhập mỗi khóa. Có nghĩa là không cho phép khóa trùng lặp. Khi các khóa trùng lặp gặp phải trong quá trình gán, nhiệm vụ cuối cùng sẽ thắng. Ví dụ -

(b) Khóa phải là bất biến. Điều đó có nghĩa là bạn có thể sử dụng các chuỗi, số hoặc bộ dữ liệu làm khóa từ điển nhưng không được phép là một thứ như ['key']. Sau đây là một ví dụ đơn giản -

Sr.No.Chức năng & Phương pháp từ điển tích hợp
1 Python bao gồm các chức năng từ điển sau -

Chức năng với mô tả

2 len(dict)

CMP (dict1, dict2)

3 str(dict)

So sánh các yếu tố của cả hai chế độ.

4 type(variable)

Cho tổng chiều dài của từ điển. Điều này sẽ bằng với số lượng các mục trong từ điển.

Tạo ra một biểu diễn chuỗi có thể in của một từ điển

Sr.No.Trả về loại của biến vượt qua. Nếu biến được truyền là từ điển, thì nó sẽ trả về một loại từ điển.
1 dict.clear()

Python bao gồm các phương pháp từ điển sau -

2 dict.copy()

Phương pháp với mô tả

3 dict.fromkeys()

Loại bỏ tất cả các yếu tố của Dictionary Dict

4 Trả lại một bản sao nông của Dictionary Dict

Tạo một từ điển mới với các khóa từ SEQ và các giá trị được đặt thành giá trị.

5 dict.has_key(key)

Dict.get (khóa, mặc định = Không)

6 dict.items()

Đối với khóa khóa, trả về giá trị hoặc mặc định nếu khóa không trong từ điển

7 dict.keys()

Trả về đúng nếu khóa trong dictict dictict, sai nếu không

8 Trả về một danh sách các cặp Tuple (khóa, giá trị) của Dict

Trả về danh sách các khóa của Dictionary Dict

9 dict.update(dict2)

dict.setDefault (khóa, mặc định = không)

10 dict.values()

Tương tự như get (), nhưng sẽ đặt Dict [key] = mặc định nếu khóa chưa có trong Dict

Có thể một chìa khóa

Một giá trị trong cặp giá trị khóa có thể là một số, chuỗi, danh sách, một tuple hoặc thậm chí từ điển khác.Trên thực tế, bạn có thể sử dụng giá trị của bất kỳ loại hợp lệ nào trong Python làm giá trị trong cặp giá trị khóa.Một chìa khóa trong cặp giá trị khóa phải là bất biến.. In fact, you can use a value of any valid type in Python as the value in the key-value pair. A key in the key-value pair must be immutable.

Từ điển Python có thể có danh sách là chìa khóa không?

Chúng ta có thể sử dụng số nguyên, chuỗi, bộ dữ liệu làm khóa từ điển nhưng không thể sử dụng danh sách làm khóa của nó.cannot use list as a key of it .

Khóa từ điển có thể là một chuỗi không?

Các khóa của từ điển có thể là bất kỳ loại bất biến, bao gồm: chuỗi, số và bộ dữ liệu: mydict = {"xin chào": "thế giới", 0: "A", 1: "B", "2":"Không phải là số" (1, 2, 3): "Một tuple!"}: mydict = {"hello": "world", 0: "a", 1: "b", "2": "not a number" (1, 2, 3): "a tuple!"}