5

Tôi đang thử nghiệm với python và bị kẹt cố gắng hiểu các thông báo lỗi trong ngữ cảnh của những gì tôi đang làm.Sự hiểu biết với nhiều bộ nhập liệu

Tôi đang chơi xung quanh với comprehensions và cố gắng tìm một mô hình để tạo ra một danh sách/hiểu từ điển với nhiều hơn một đầu vào thiết lập (giả định này là có thể):

Lưu ý: Ở đây chữ đầu vào thiết lập có nghĩa là khu vực đầu vào của việc hiểu. Trong ký pháp setbuilder, từ nơi python bắt nguồn từ sự hiểu biết của nó [Y cho X trong LIST], Y là hàm đầu ra, X là biến và LIST là tập hợp đầu vào.

Giả sử tôi có mã làm việc tiếp theo:

from random import randint 

mydict = {k: 0 for k in range(10)} 
result = {randint(0,9): v + 1 for v in mydict.values()} 

Tôi không cố gắng để làm bất cứ điều gì đặc biệt về nó. Đây không phải là mã hữu ích bởi vì nó sẽ không hoạt động như mong đợi. Tất cả các phần tử trong từ điển sẽ có giá trị 1, thay vì chỉ các giá trị được chỉ bởi trình tạo ngẫu nhiên. Mục tiêu duy nhất của tôi là có cơ sở từ nơi tôi bắt đầu nỗ lực làm việc với một bộ bộ đầu vào.

from random import randint 

mydict = {k: 0 for k in range(10)} 
result = {k: v + 1 for k, v in (randint(0,9), mydict.values())} 

Tùy chọn này cung cấp cho tôi: TypeError: 'int' object is not iterable.

Bằng cách trao đổi các bộ đầu vào và giải nén tôi có:

result = {k: v + 1 for *v, k in (mydict.values(), randint(0,9))} 

Nhưng tùy chọn này mang lại cho tôi: TypeError: can only concatenate list (not "int") to list

Are các lỗi này xuất hiện vì tôi đang cố gắng để làm điều gì đó ngữ pháp ngôn ngữ không hiểu, hoặc tôi thiếu một cái gì đó và tôi thực sự có thể sửa mã?

+4

Nó không rõ ràng những gì đầu ra bạn * mong đợi *. Nói 'randint (0,9)' trả lại 3; bạn muốn kết quả nào? – DSM

+0

Bạn có muốn một dict có khóa từ 'range (10)' và các giá trị ngẫu nhiên từ 'randint' không? – Navith

+1

Bạn đang tập trung vào ý định mã. Ý định duy nhất ở đây là để xem liệu có một cách để có một bộ bộ đầu vào trong một sự hiểu biết hay không. Mã chỉ là cơ sở của tôi để thử nghiệm. –

Trả lời

7

Bạn sẽ phải tạo một hiểu riêng biệt cho các số ngẫu nhiên, vì nó hiện đang đứng, bạn chỉ có một số ngẫu nhiên. Ngoài ra, sau đó bạn sẽ cần để nén các kết quả để có được một thực thể kết hợp:

>>> from random import randint 
>>> mydict = {k: 0 for k in range(10)} 
>>> result = {k: v + 1 for k, v in zip([randint(0,9) for _ in range(10)] , mydict.values())} 
>>> result 
{2: 1, 3: 1, 4: 1, 5: 1, 8: 1, 9: 1} 

Lưu ý rằng kể từ khi dict ban đầu của bạn có giá trị 0 cho tất cả các phím của nó, tất cả các giá trị trong dict kết quả là 1 (0+1) .

Ngoài ra, vì chúng tôi đang tạo khóa ngẫu nhiên, nên có thể chồng chéo nhau (giả sử 2 được tạo hai lần), vì vậy đó là lý do tại sao chúng tôi không thấy tất cả các phím trong từ điển result.

Như @wim lưu ý trong ý kiến ​​dưới đây, một cách tốt hơn để tạo từ điển kết quả này sẽ được sử dụng:

>>> {randint(0,9): v+1 for v in mydict.values()} 
{0: 1, 1: 1, 2: 1, 3: 1, 6: 1, 7: 1} 
+2

Đó là một cách kỳ lạ để đi về nó. Bạn cũng có thể chỉ cần đặt randint (0, 9) vào như k và chỉ bao gồm v trong hiểu. – wim

+1

@wim Đúng vậy, tôi đã tập trung vào việc nói với OP điều gì sai với mã hiện tại ... –

+1

Thật tuyệt vời, mu! Cảm ơn đã giúp tôi tìm nơi tôi đã đi sai. @ wim, đây chỉ là một thử nghiệm. Ý định thực sự là cố gắng tìm một cách để có một bộ bộ đầu vào –

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