Hướng dẫn python unpack dictionary to variables - từ điển giải nén python thành các biến

56

Mới! Lưu câu hỏi hoặc câu trả lời và sắp xếp nội dung yêu thích của bạn. Tìm hiểu thêm.
Learn more.

Tôi đang học Python và hiện đang trải qua một số học tập khác với từ điển.

Tôi đã tự hỏi;

Nếu tôi có một từ điển như:

from operator import itemgetter

d = {'key_1': 'value_a', 'key_2': 'value_b'}
key_1, key_2 = itemgetter('key_1', 'key_2')(d)

# prints "Key 1: value_a, Key 2: value_b"
print("Key 1: {}, Key 2: {}".format(key_1, key_2))
6 và tôi muốn riêng/chia từ điển này thành các biến trong đó mỗi biến là một khóa từ từ điển và mỗi giá trị biến là giá trị của khóa đó trong từ điển.

Điều gì sẽ là cách tốt nhất để đạt được điều này?

d = {'key_1': 'value_a', 'key_2': 'value_b'}
#perform the command and get
key_1 = 'value_a'
key_2 = 'value_b'

Tôi đã thử:

from operator import itemgetter

d = {'key_1': 'value_a', 'key_2': 'value_b'}
key_1, key_2 = itemgetter('key_1', 'key_2')(d)

# prints "Key 1: value_a, Key 2: value_b"
print("Key 1: {}, Key 2: {}".format(key_1, key_2))
7 nhưng nó không hoạt động.

Về cơ bản, tôi đang tìm kiếm sự khôn ngoan của chuyên gia để tìm hiểu xem có cách nào tốt hơn để giảm 2 dòng mã thành một.

Lưu ý: Đây không phải là một sáng tạo biến động.

Đã hỏi ngày 22 tháng 6 năm 2012 lúc 13:04Jun 22, 2012 at 13:04

Hướng dẫn python unpack dictionary to variables - từ điển giải nén python thành các biến

PhilPhilPhil

12.9k20 Huy hiệu vàng78 Huy hiệu bạc124 Huy hiệu đồng20 gold badges78 silver badges124 bronze badges

13

Các câu trả lời hiện có sẽ hoạt động, nhưng tất cả chúng đều thực hiện lại một hàm đã tồn tại trong Thư viện tiêu chuẩn Python:

from operator import itemgetter

d = {'key_1': 'value_a', 'key_2': 'value_b'}
key_1, key_2 = itemgetter('key_1', 'key_2')(d)

# prints "Key 1: value_a, Key 2: value_b"
print("Key 1: {}, Key 2: {}".format(key_1, key_2))
8

Từ các tài liệu:

Trả về một đối tượng có thể gọi được lấy vật phẩm từ toán hạng của nó bằng phương thức toán hạng __getitem __ (). Nếu nhiều mục được chỉ định, hãy trả về một bộ giá trị tra cứu. Ví dụ:

Sau f = itemgetter (2), cuộc gọi f (r) trả về r [2].

Sau g = itemgetter (2, 5, 3), cuộc gọi g (r) trả về (r [2], r [5], r [3]).


Nói cách khác, nhiệm vụ dictor bị phá hủy của bạn trở thành một cái gì đó giống như:

from operator import itemgetter

d = {'key_1': 'value_a', 'key_2': 'value_b'}
key_1, key_2 = itemgetter('key_1', 'key_2')(d)

# prints "Key 1: value_a, Key 2: value_b"
print("Key 1: {}, Key 2: {}".format(key_1, key_2))

Đã trả lời ngày 16 tháng 3 năm 2018 lúc 5:53Mar 16, 2018 at 5:53

Mintchkinmintchkinmintchkin

1.5142 Huy hiệu vàng14 Huy hiệu bạc13 Huy hiệu đồng2 gold badges14 silver badges13 bronze badges

0

Vấn đề là các dicts không được đặt hàng, vì vậy bạn không thể sử dụng việc giải nén đơn giản

from operator import itemgetter

d = {'key_1': 'value_a', 'key_2': 'value_b'}
key_1, key_2 = itemgetter('key_1', 'key_2')(d)

# prints "Key 1: value_a, Key 2: value_b"
print("Key 1: {}, Key 2: {}".format(key_1, key_2))
9. Tất nhiên bạn có thể sắp xếp Dict by Key, sau đó giải nén các giá trị:

# Note: in python 3, items() functions as iteritems() did
#       in older versions of Python; use it instead
ds = sorted(d.iteritems())
name0, name1, name2..., namen = [v[1] for v in ds]

Bạn cũng có thể, ít nhất là trong một đối tượng, làm một cái gì đó như:

for k, v in dict.iteritems():
    setattr(self, k, v)

Ngoài ra, như tôi đã đề cập trong nhận xét ở trên, nếu bạn có thể nhận được tất cả logic của mình cần từ điển chưa đóng gói của bạn làm biến trong một hàm, bạn có thể làm:

def func(**kwargs):
    # Do stuff with labeled args

func(**d)

Đã trả lời ngày 22 tháng 6 năm 2012 lúc 13:11Jun 22, 2012 at 13:11

Silas Raysilas RaySilas Ray

25.2K5 Huy hiệu vàng47 Huy hiệu bạc61 Huy hiệu Đồng5 gold badges47 silver badges61 bronze badges

8

Một giải pháp chưa được đề cập trước đây sẽ là

dictget = lambda d, *k: [d[i] for i in k]

Và sau đó sử dụng nó:

key_1, key_2 = dictget(d, 'key_1', 'key_2')

Lợi thế của họ là nó khá dễ đọc ngay cả với nhiều biến số được truy xuất.

Tuy nhiên, thậm chí dễ đọc hơn sẽ là một chức năng "thực sự" như

def dictget(d, *k):
    """Get the values corresponding to the given keys in the provided dict."""
    return [d[i] for i in k]
    # or maybe
    return (d[i] for i in k) # if we suppose that we have bigger sets of result
    # or, equivalent to this
    for i in k:
        yield d[i]

cũng hỗ trợ bình luận với một tài liệu và sẽ được ưu tiên.

Đã trả lời ngày 22 tháng 6 năm 2012 lúc 13:51Jun 22, 2012 at 13:51

GLGLGLGLGLglglgl

86.9K12 Huy hiệu vàng146 Huy hiệu bạc215 Huy hiệu Đồng12 gold badges146 silver badges215 bronze badges

2

var1, var2 = (lambda key1, key2: (key1, key2))(**d)

Nếu bạn muốn cung cấp cho bất cứ ai đọc mã của bạn một cơn đau đầu, bạn có thể sử dụng hàm ẩn danh để giải nén các giá trị như thế này.

Đã trả lời ngày 27 tháng 8 năm 2013 lúc 12:53Aug 27, 2013 at 12:53

DevilholkdevilholkDevilholk

Huy hiệu 611 Bạc1 Huy hiệu Đồng1 silver badge1 bronze badge

Bạn có thể làm điều này, nếu bạn dũng cảm:

for k, v in d.items():
    locals()[k] = v

Nhưng trở nên dũng cảm có thể không đủ - bạn cũng có thể phải liều lĩnh, v.v.

Nếu bạn muốn trở thành một anh hùng liều lĩnh như @ecatmur, bạn có thể làm điều này:

from operator import itemgetter

d = {'key_1': 'value_a', 'key_2': 'value_b'}
key_1, key_2 = itemgetter('key_1', 'key_2')(d)

# prints "Key 1: value_a, Key 2: value_b"
print("Key 1: {}, Key 2: {}".format(key_1, key_2))
0

Nhưng bây giờ OP đã cập nhật câu hỏi của anh ấy và trả lời các bình luận, dường như, đây không phải là điều anh ấy thực sự muốn làm. Chỉ cho hồ sơ: Có những lý do chính đáng để tạo ra các biến động - ngay cả khi mọi người ở đây đồng ý rằng đó không phải là Pythonic. Rất nhiều vấn đề về phong cách phiên dịch có thể được giải quyết một cách neet một cách năng động với sự thay đổi động của phạm vi của bạn. Chỉ cần làm điều này trong một thời trang được kiểm soát. Và ... uh, đừng triển khai điều này cho một số trang web sản xuất;)

Đã trả lời ngày 22 tháng 6 năm 2012 lúc 13:15Jun 22, 2012 at 13:15

Daren Thomasdaren ThomasDaren Thomas

66.2K40 Huy hiệu vàng149 Huy hiệu bạc198 Huy hiệu đồng40 gold badges149 silver badges198 bronze badges

3

Tôi thực sự có một Usecase, nơi tôi kéo tất cả các đối số của phương pháp

# Note: in python 3, items() functions as iteritems() did
#       in older versions of Python; use it instead
ds = sorted(d.iteritems())
name0, name1, name2..., namen = [v[1] for v in ds]
0 vào không gian tên tự tạo về xây dựng đối tượng:

from operator import itemgetter

d = {'key_1': 'value_a', 'key_2': 'value_b'}
key_1, key_2 = itemgetter('key_1', 'key_2')(d)

# prints "Key 1: value_a, Key 2: value_b"
print("Key 1: {}, Key 2: {}".format(key_1, key_2))
1

Chức năng Vars giúp bạn có một quyền của không gian tên trên mạng được liên kết với đối tượng được truyền. Tuy nhiên, điều này sẽ không hoạt động với người dân địa phương trong một chức năng, do các chi tiết triển khai CPython. Vì vậy, nó không được phép làm việc trên tất cả các phiên dịch viên.

Đối với không gian tên toàn cầu, bạn sẽ thay thế

# Note: in python 3, items() functions as iteritems() did
#       in older versions of Python; use it instead
ds = sorted(d.iteritems())
name0, name1, name2..., namen = [v[1] for v in ds]
1 bằng
# Note: in python 3, items() functions as iteritems() did
#       in older versions of Python; use it instead
ds = sorted(d.iteritems())
name0, name1, name2..., namen = [v[1] for v in ds]
2, nhưng đây thực sự là một dấu hiệu cho thấy có gì đó không ổn với logic của bạn. Như đã nói, đối với các biến cục bộ, điều này sẽ không hoạt động (nó sẽ
# Note: in python 3, items() functions as iteritems() did
#       in older versions of Python; use it instead
ds = sorted(d.iteritems())
name0, name1, name2..., namen = [v[1] for v in ds]
3 ngay cả khi bạn đã gán một giá trị cho dict).

Đã trả lời ngày 22 tháng 6 năm 2012 lúc 13:15Jun 22, 2012 at 13:15

Hướng dẫn python unpack dictionary to variables - từ điển giải nén python thành các biến

Daren Thomasdaren ThomasJonas Schäfer

66.2K40 Huy hiệu vàng149 Huy hiệu bạc198 Huy hiệu đồng5 gold badges54 silver badges69 bronze badges

0

Tôi thực sự có một Usecase, nơi tôi kéo tất cả các đối số của phương pháp

# Note: in python 3, items() functions as iteritems() did
#       in older versions of Python; use it instead
ds = sorted(d.iteritems())
name0, name1, name2..., namen = [v[1] for v in ds]
0 vào không gian tên tự tạo về xây dựng đối tượng:

from operator import itemgetter

d = {'key_1': 'value_a', 'key_2': 'value_b'}
key_1, key_2 = itemgetter('key_1', 'key_2')(d)

# prints "Key 1: value_a, Key 2: value_b"
print("Key 1: {}, Key 2: {}".format(key_1, key_2))
2

Chức năng Vars giúp bạn có một quyền của không gian tên trên mạng được liên kết với đối tượng được truyền. Tuy nhiên, điều này sẽ không hoạt động với người dân địa phương trong một chức năng, do các chi tiết triển khai CPython. Vì vậy, nó không được phép làm việc trên tất cả các phiên dịch viên.Jun 22, 2012 at 17:38

Đối với không gian tên toàn cầu, bạn sẽ thay thế

# Note: in python 3, items() functions as iteritems() did
#       in older versions of Python; use it instead
ds = sorted(d.iteritems())
name0, name1, name2..., namen = [v[1] for v in ds]
1 bằng
# Note: in python 3, items() functions as iteritems() did
#       in older versions of Python; use it instead
ds = sorted(d.iteritems())
name0, name1, name2..., namen = [v[1] for v in ds]
2, nhưng đây thực sự là một dấu hiệu cho thấy có gì đó không ổn với logic của bạn. Như đã nói, đối với các biến cục bộ, điều này sẽ không hoạt động (nó sẽ
# Note: in python 3, items() functions as iteritems() did
#       in older versions of Python; use it instead
ds = sorted(d.iteritems())
name0, name1, name2..., namen = [v[1] for v in ds]
3 ngay cả khi bạn đã gán một giá trị cho dict).Tanu

Jonas Schäferjonas Schäfer2 silver badges7 bronze badges

1

Huy hiệu vàng 19,5K554 Huy hiệu bạc69 Huy hiệu đồng

from operator import itemgetter

d = {'key_1': 'value_a', 'key_2': 'value_b'}
key_1, key_2 = itemgetter('key_1', 'key_2')(d)

# prints "Key 1: value_a, Key 2: value_b"
print("Key 1: {}, Key 2: {}".format(key_1, key_2))
3

Tôi nghĩ điều này sẽ giải quyết vấn đề của bạn

Đã trả lời ngày 22 tháng 6 năm 2012 lúc 17:38Jan 30, 2021 at 7:40

Hướng dẫn python unpack dictionary to variables - từ điển giải nén python thành các biến

Tanutanu

Đã trả lời ngày 22 tháng 6 năm 2012 lúc 13:14Jun 22, 2012 at 13:14

Hướng dẫn python unpack dictionary to variables - từ điển giải nén python thành các biến

Emmett Butleremmett ButlerEmmett Butler

5.5792 Huy hiệu vàng28 Huy hiệu bạc46 Huy hiệu đồng2 gold badges28 silver badges46 bronze badges

1

Dưới đây là một giải pháp sử dụng mô -đun kiểm tra của Python trên khung ngăn xếp để xác định cách trích xuất các giá trị phù hợp từ từ điển được cung cấp. Ngay bây giờ, kiểm tra duy nhất là đảm bảo rằng có một giá trị có sẵn cho mỗi biến đầu ra, nhưng hãy thoải mái thêm kiểm tra bổ sung nếu bạn cần chúng.

from operator import itemgetter

d = {'key_1': 'value_a', 'key_2': 'value_b'}
key_1, key_2 = itemgetter('key_1', 'key_2')(d)

# prints "Key 1: value_a, Key 2: value_b"
print("Key 1: {}, Key 2: {}".format(key_1, key_2))
4

Việc sử dụng trông như thế này:

from operator import itemgetter

d = {'key_1': 'value_a', 'key_2': 'value_b'}
key_1, key_2 = itemgetter('key_1', 'key_2')(d)

# prints "Key 1: value_a, Key 2: value_b"
print("Key 1: {}, Key 2: {}".format(key_1, key_2))
5

Đã trả lời ngày 12 tháng 4 năm 2019 lúc 5:34Apr 12, 2019 at 5:34

Làm cách nào để giải nén một từ điển trong Python?

Làm thế nào để giải nén từ điển trong Python..
Sử dụng toán tử giải nén (**) để giải nén từ điển trong Python ..
Sử dụng vòng lặp để giải nén từ điển trong Python ..
Sử dụng hàm iterItems () để giải nén từ điển trong python ..
Sử dụng hàm () để giải nén từ điển trong Python ..

Làm thế nào để chúng ta tìm nạp các giá trị từ từ điển?

Bạn có thể sử dụng phương thức get () của từ điển (dict) để nhận bất kỳ giá trị mặc định nào mà không có lỗi nếu khóa không tồn tại.Chỉ định khóa là đối số đầu tiên.Giá trị tương ứng được trả về nếu khóa tồn tại và không có giá trị nào được trả về nếu khóa không tồn tại.use the get() method of the dictionary ( dict ) to get any default value without an error if the key does not exist. Specify the key as the first argument. The corresponding value is returned if the key exists, and None is returned if the key does not exist.

Làm thế nào để bạn tạo ra một từ điển trong Python?

Trong [1]: t = {1: 2} trong [2]: x = {'a': t, 'b': t} trong [3]: x out [3]: {'a': {1: 2}, 'B': {1: 2}} trong [4]: x ['a'].Cập nhật ({1: 4}) trong [5]: x out [5]: {'A': {1: 4}, 'B': {1: 4}} trong [6]:

Làm thế nào để bạn vượt qua nhiều tham số từ điển trong Python?

** Kwargs: Chuyển nhiều đối số cho một hàm trong Python nếu vậy, hãy sử dụng ** kwargs.** kwargs cho phép bạn chuyển nhiều đối số cho một hàm bằng từ điển.Trong ví dụ dưới đây, việc vượt qua ** {'A': 1, 'B': 2} cho hàm tương tự như chuyển a = 1, b = 1 cho hàm.use **kwargs . **kwargs allow you to pass multiple arguments to a function using a dictionary. In the example below, passing **{'a':1, 'b':2} to the function is similar to passing a=1, b=1 to the function.