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'}
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