2013-07-24 28 views
7

Tôi đang cố gắng để viết một sự hiểu biết đó sẽ soạn hai bộ từ điển theo cách sau:Python: hiểu biết để soạn hai bộ từ điển

d1 = {1:'a',2:'b',3:'c'} 
d2 = {'a':'A','b':'B','c':'C'} 
result = {1:'A',2:'B',3:'C'} 

Đó là, từ điển kết quả được hình thành từ các phím của người đầu tiên và các giá trị của một giây cho mỗi cặp trong đó giá trị của một đầu tiên là bằng chìa khóa của một giây.

Đây là những gì tôi đã có cho đến nay:

{ k1:v2 for (k1,v1) in d1 for (k2,v2) in d2 if v1 == k2 } 

nhưng nó không hoạt động. Tôi mới sử dụng Python nên tôi không chắc liệu điều này có thực sự hợp lý hay không. Tôi đang sử dụng python 3.3.2 bằng cách này.

Xin cảm ơn trước.

+0

Xin cảm ơn tất cả mọi người, tôi muốn chấp nhận nhiều hơn một. – Roma149

Trả lời

9

Một cách để làm điều đó là:

result = {k: d2.get(v) for k, v in d1.items()} 

hành vi gì bạn đã muốn cho các phím có giá trị mà không có trong d2?

+0

+1 không bị lỗi khi 'd2' không có khóa cho một số giá trị trong' d1'. –

+0

Hoạt động như một sự quyến rũ, cảm ơn rất nhiều. Tôi có một tập hợp các đầu vào cố định, mà tôi biết có định dạng đó, vì vậy sẽ ổn nếu tôi để hành vi đó không được chỉ định. – Roma149

+1

Chỉ để được rõ ràng - ở trên sẽ cung cấp cho bất kỳ khóa chưa khớp nào giá trị 'Không có'. Để bỏ qua các khóa chưa khớp, bạn nên sử dụng '{k: d2 [v] cho k, v trong d1.items() nếu v trong d2}' –

6

Chỉ cần lặp qua các hạng mục công d1 và sau đó cho mỗi phần tử mà bạn muốn đưa vào kết quả không sử dụng các giá trị từ d1 nhưng thay vì tìm kiếm các giá trị mới trong d2 sử dụng giá trị d1 's là chìa khóa:

>>> d1 = {1: 'a', 2: 'b', 3: 'c'} 
>>> d2 = {'a': 'A', 'b': 'B', 'c': 'C'} 
>>> d = {k: d2[v] for (k, v) in d1.items()} 
>>> d 
{1: 'A', 2: 'B', 3: 'C'} 
2

cách này hoạt động ngay cả khi không phải tất cả các giá trị trong d1 là chìa khóa hợp lệ cho d2:

{k1:d2[d1[k1]] for k1 in d1 if d1[k1] in d2} 
2
This is what I've got so far: 

    { k1:v2 for (k1,v1) in d1 for (k2,v2) in d2 if v1 == k2 } 

Hai điều bạn nên lưu ý:

1) Khi bạn sử dụng một phi trong vòng lặp trực tiếp trên một dict:

for (k1, v1) in some_dict: 

vòng python trên các phím trong dict, tức là cho trong vòng lặp là tương đương với:

for (k1, v1) in some_dict.keys() 

Nhưng bạn đang nói python rằng sẽ có một tuple hai trở lại mỗi lần thông qua các vòng lặp, (k1, v1), và python chỉ trả lại một mỗi lần qua vòng chìa khóa. Vì vậy, đó là một lỗi. Bạn có thể sửa điều đó bằng cách viết:

for (k1, v1) in some_dict.items() 

Hàm items() trả về hai tuple: (khóa, giá trị) mỗi lần qua vòng lặp.

2) Giả sử bạn có dữ liệu này:

data = [ 
    [1, 2, 3], 
    ['a', 'b', 'c'] 
] 

Để lặp qua mỗi trong số sáu giá trị, nó cảm thấy tự nhiên để viết:

results = [x for x in inner_array for inner_array in data] 

Nhưng điều đó tạo ra các lỗi:

Traceback (most recent call last): 
    File "1.py", line 5, in <module> 
    results = [x for x in inner_array for inner_array in data] 
NameError: name 'inner_array' is not defined 

Để làm cho nó hoạt động, các vòng lặp phải được viết "lùi":

results = [x for inner_array in data for x in inner_array] 
print results 

--output:-- 
[1, 2, 3, 'a', 'b', 'c'] 

Tôi nghĩ rằng cách dễ nhất để nhớ đó là: các vòng là theo thứ tự giống như nếu bạn đã viết cho họ mà không có một danh sách hiểu:

results = [] 

for inner_array in data: 
    for x in inner_array: 
     results.append(x) 

Cá nhân, tôi muốn nhìn thấy những thay đổi trong python, để bên trong một danh sách/dict/set comprehension bạn làm việc từ "bên trong ra ngoài", giống như bạn đã viết nó. Trong mọi trường hợp, đây là mã của bạn trông như thế nào với các thay đổi:

d1 = {1:'a',2:'b',3:'c'} 
d2 = {'a':'A','b':'B','c':'C'} 

results = { 
     k1: v2 
     for (k2,v2) in d2.items() 
     for (k1,v1) in d1.items() if v1 == k2 
} 

print results 

--output:-- 
{1: 'A', 2: 'B', 3: 'C'} 
+0

@ Roma149, có thể hữu ích khi xem giải thích của tôi về những gì bạn đã làm sai khi viết đọc hiểu dict của bạn. – 7stud

+0

Wow, lời giải thích nổi bật, tôi thực sự đánh giá cao nó. Có vẻ như phiên bản của tôi đã có ý nghĩa sau tất cả :) – Roma149

+0

@ Roma149, Đúng vậy. Bạn gần như đã có nó. Darn tốt cho người mới bắt đầu. – 7stud

Các vấn đề liên quan