Hiểu bộ Python


80

Vì vậy, tôi có hai vấn đề này cho một bài tập về nhà và tôi bị mắc kẹt ở vấn đề thứ hai.

  1. Sử dụng phép hiểu tập hợp Python (tương đương với ký hiệu Set Builder của Python) để tạo một tập hợp tất cả các số nguyên tố nhỏ hơn 100. Nhớ lại rằng số nguyên tố là số nguyên lớn hơn 1 và không chia hết cho bất kỳ số nguyên nào khác chính nó và 1. Lưu trữ tập hợp các số nguyên tố của bạn trong một biến (bạn sẽ cần nó cho các phần bổ sung). Đưa ra tập hợp các số nguyên tố của bạn (ví dụ: với hàm in).

  2. Sử dụng tính năng hiểu tập hợp trong Python để tạo một tập hợp các cặp có thứ tự (các bộ có độ dài 2) bao gồm tất cả các cặp số nguyên tố bao gồm các số nguyên tố nhỏ hơn 100. Một cặp số nguyên tố là một cặp số lẻ liên tiếp đều là số nguyên tố. Lưu trữ tập hợp các Cặp nguyên tố của bạn trong một biến. Bộ số 1 của bạn sẽ rất hữu ích. Đưa ra Tập hợp các cặp nguyên tố của bạn.

Đối với cái đầu tiên, điều này hoạt động hoàn hảo:

r= {x for x in range(2, 101) 
if not any(x % y == 0 for y in range(2, x))} 

Tuy nhiên, tôi khá bối rối trong điều thứ hai. Tôi nghĩ rằng tôi có thể phải lấy tích Descartes của tập r với một cái gì đó nhưng tôi không chắc lắm.

Điều này giúp tôi gần gũi một chút nhưng tôi chỉ muốn các cặp liên tiếp.

cart = { (x, y) for x in r for y in r
     if x < y }

Câu trả lời:


69
primes = {x for x in range(2, 101) if all(x%y for y in range(2, min(x, 11)))}

Tôi đã đơn giản hóa bài kiểm tra một chút - if all(x%ythay vìif not any(not x%y

Tôi cũng giới hạn phạm vi của y; không có ích lợi gì khi kiểm tra ước số> sqrt (x). Vì vậy, max (x) == 100 ngụ ý max (y) == 10. Với x <= 10, y cũng phải <x.

pairs = {(x, x+2) for x in primes if x+2 in primes}

Thay vì tạo các cặp số nguyên tố và kiểm tra chúng, hãy lấy một cặp và xem liệu số nguyên tố cao hơn tương ứng có tồn tại hay không.


14

Bạn có thể nhận được các giải pháp rõ ràng và rõ ràng bằng cách xây dựng các vị từ thích hợp làm chức năng trợ giúp. Nói cách khác, sử dụng ký hiệu trình xây dựng tập hợp Python giống như cách bạn viết câu trả lời bằng ký hiệu tập hợp toán học thông thường.

Toàn bộ ý tưởng đằng sau sự hiểu biết thiết lập là cho phép chúng ta viết và lập luận bằng mã giống như cách chúng ta làm toán bằng tay.

Với một vị từ thích hợp trong tay, vấn đề 1 đơn giản hóa thành:

 low_primes = {x for x in range(1, 100) if is_prime(x)}

Và vấn đề 2 đơn giản hóa thành:

 low_prime_pairs = {(x, x+2) for x in range(1,100,2) if is_prime(x) and is_prime(x+2)}

Lưu ý rằng đoạn mã này là bản dịch trực tiếp của đặc tả vấn đề, "Một cặp số nguyên tố là một cặp số lẻ liên tiếp đều là số nguyên tố."

Tái bút Tôi đang cố gắng cung cấp cho bạn kỹ thuật giải quyết vấn đề chính xác mà không thực sự đưa ra câu trả lời cho vấn đề bài tập về nhà.


2
Mặc dù vấn đề 2 có thể được đơn giản hóa để chỉ lặp lại kết quả của vấn đề thứ 1, như được gợi ý trong hướng dẫn.
tripleee

5

Bạn có thể tạo các cặp như thế này:

{(x, x + 2) for x in r if x + 2 in r}

Sau đó, tất cả những gì còn lại cần làm là lấy một điều kiện để biến chúng thành nguyên tố, điều mà bạn đã làm trong ví dụ đầu tiên.

Một cách khác để làm điều đó: (Mặc dù chậm hơn đối với các bộ số nguyên tố lớn)

{(x, y) for x in r for y in r if x + 2 == y}

3
Tôi không chắc tại sao cách tốt hơn của bạn lại tốt hơn. OP đã có các số nguyên tố nhỏ hơn 100 in r, như vậy là {(x, x + 2) for x in r if x + 2 in r}đủ.
DSM

2
and x % 2 == 1không cần thiết.
thefourtheye

2
cố định, cảm ơn bạn, vì một lý do tôi nghĩ rằng số nguyên tố có thể còn
icedtrees

2
Không hiểu sao tôi không thấy thiếu cái nào. Tôi được đặt ([(29, 31), (59, 61), (5, 7), (71, 73), (41, 43), (3, 5), (17, 19), (11, 13)]). Những cặp nào còn thiếu? Bạn đã áp dụng điều kiện (là số nguyên tố) cho r, vì vậy mã sẽ ổn.
icedtrees

Không, bạn hoàn toàn đúng. Tôi có ấn tượng (7,11) và (13,17) vv ... được bao gồm trong các cặp số nguyên tố vì về mặt kỹ thuật chúng "liên tiếp" trong danh sách các số nguyên tố. Nhưng giờ thì tôi đã hiểu.
user3308790
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.