2012-06-27 66 views
7

Về cơ bản tôi cần sự giúp đỡ trong việc tạo ngay cả con số từ một danh sách mà tôi đã tạo ra bằng Python:Tạo một danh sách các số chẵn trong Python

[1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, ...] 

Tôi đã thử một vài phương pháp khác nhau, nhưng mỗi khi tôi in, có những con số lẻ trộn lẫn với những kẻ xấu!

Tôi biết cách tạo số chẵn/lẻ nếu tôi đã thực hiện phạm vi từ 0-100, tuy nhiên, chỉ nhận được số chẵn từ danh sách được đề cập trước đó đã khiến tôi bối rối!

P.S. Tôi đã chỉ được sử dụng python cho một vài ngày, nếu điều này hóa ra là cực kỳ đơn giản, cảm ơn trước!

EDIT: Cảm ơn tất cả các câu trả lời, với sự trợ giúp của bạn, tôi đã vượt qua được vấn đề nhỏ này. Đây là những gì tôi đã kết thúc với để hoàn thành một chút excercise hỏi để tổng hợp các số chẵn của dãy Fibonacci:

F = [1, 2] 
while F[-1] < 4000000 
    F.append(F[-1] + F[-2]) 

sum(F[1::3]) 
4613732 
+0

Chỉ bao gồm các số trong danh sách mục tiêu của bạn nếu nó là chia hết cho 2. –

+4

các phương pháp khác nhau mà bạn đã cố gắng là gì? – geoffspear

+3

Hơi lạ bạn đã quản lý để tạo ra một dãy Fibonacci trước khi bạn có thể lọc một danh sách ...;) –

Trả lời

4

Các mẫu sau đây nên giải quyết vấn đề của bạn.

Newlist = [] 
for x in numList: 
    if x % 2 == 0: 
     print x   
     Newlist.append(x) 
+0

Đây là nếu bạn muốn in tất cả các số chẵn - nếu bạn muốn có danh sách mà bạn có thể làm việc, hãy xem các câu trả lời dưới đây. Chỉnh sửa: Tôi thấy phiên bản mới gắn nó vào danh sách mới :) –

1

lặp qua danh sách và sử dụng toán tử modulo để kiểm tra thậm chí

for number in list: 
    if (number % 2) == 0: 
     ##EVEN 
+0

nah, danh sách hiểu là cách tốt hơn cho loại điều này –

+0

đã đồng ý ... Tôi chưa từng thấy chúng trước đây. Họ nhìn nhanh và hiệu quả! – javajavajava

14

Sử dụng một danh sách hiểu (xem: Searching a list of objects in Python)

myList = [<your list>] 
evensList = [x for x in myList if x % 2 == 0] 

này là tốt vì nó để lại danh sách còn nguyên vẹn và bạn có thể làm việc với evensList như một đối tượng danh sách bình thường.

Hy vọng điều này sẽ hữu ích!

+1

Đây là thứ sạch nhất. Bạn đánh tôi với nó, có một upvote. –

+0

Tôi nghĩ rằng việc hiểu danh sách có thể là một chút để nâng cao trong những ngày đầu tiên với python ... nhưng đó chỉ là ý kiến ​​của tôi! – Trufa

+0

@Trufa list comprehensions là một trong những phần hay nhất về python ... tại sao không giới thiệu chúng sớm? –

3

Trong trường hợp cụ thể của bạn my_list[1::3] sẽ hoạt động. Luôn có hai số nguyên lẻ giữa nguyên ngay cả trong fibonacci: chẵn, lẻ, lẻ, thậm chí, kỳ quặc, kỳ quặc .....

>>> my_list = [1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368] 
>>>   
... 
>>> my_list[1::3] 
[2, 8, 34, 144, 610, 2584, 10946, 46368] 
+0

Trường hợp này hoạt động, nhưng bởi vì bạn đang dựa vào việc cắt và đẩy theo chỉ mục, nó không phải là giải pháp di động. – jathanism

+0

Tôi thấy bạn đang cắt danh sách, nhưng có hai dấu hai chấm? Phương pháp này được gọi là gì? –

+1

@Erty - Số thứ ba là "bước tiến". Bạn bắt đầu ở phần tử đầu tiên và sau đó lấy mọi phần tử thứ 3 sau đó. – mgilson

0

Bạn có thể sử dụng list comprehension để tạo ra một danh sách mới chỉ chứa các thành viên thậm chí từ danh sách ban đầu của bạn.

data = [1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144] 

thì:

new_data = [i for i in data if not i%2] 

mang

[2, 8, 34, 144] 

Hoặc cách khác sử dụng một biểu phát nếu bạn không cần tất cả các số cùng một lúc:

new_data = (i for i in data if not i%2) 

Các giá trị t hen sẽ được Sẵn có khi cần thiết, ví dụ nếu bạn sử dụng một vòng lặp for:

ví dụ:

for val in new_data: 
    print val 

Ưu điểm của biểu thức máy phát điện được rằng toàn bộ danh sách không được tạo ra và lưu trữ trong bộ nhớ cùng một lúc, nhưng các giá trị được tạo ra khi bạn cần chúng, làm cho ít nhu cầu về bộ nhớ hơn.Có những khác biệt quan trọng khác mà bạn có thể muốn đọc vào một lúc nào đó nếu bạn quan tâm.

2

Bạn có thể làm điều này với a list comprehension:

evens = [n for n in numbers if n % 2 == 0] 

Bạn cũng có thể sử dụng the filter function.

evens = filter(lambda x: x % 2 == 0,numbers) 

Nếu danh sách rất dài nó có thể được mong muốn để tạo ra một cái gì đó để lặp qua danh sách chứ không phải là tạo ra một bản sao của một nửa của nó sử dụng ifilter from itertools:

from itertools import ifilter 
evens = ifilter(lambda x: x % 2 == 0,numbers) 

Hoặc bằng cách sử dụng một generator expression:

evens = (n for n in numbers if n % 2 == 0) 
+0

OP, đây là một câu trả lời tuyệt vời nhưng xem xét rằng lambda là một chút quá tiên tiến cho những ngày đầu tiên của python :) – Trufa

+0

Ugh, 'ifilter'? Chỉ '(x cho x trong số nếu không x% 2)' hoạt động. – katrielalex

+0

Đã thêm một biểu thức máy phát điện, mặc dù tôi đã đi cho 'n% 2 == 0' –

0

Just for fun, kiểm tra nếu number%2 != 1 cũng làm việc;)

evens=[x for x in evens_and_odds if number%2 != 1 ] 

Lưu ý rằng bạn có thể làm một số việc khéo léo để tách ra làm mềm mại và tỷ lệ cược trong một vòng lặp:

evens=[] 
odds=[] 
numbers=[ evens, odds ] 
for x in evens_and_odds: 
    numbers[x%2 == 1].append(x) 

print evens 
print odds 

Bí quyết trên hoạt động vì các biểu thức logic (==, >, vv) hoạt động trên số True (1) và/hoặc False (0).

0

Thay vì tạo tất cả các số Fibonacci sau đó lọc cho evens, tại sao không tạo ra chỉ là giá trị thậm chí?

def even_fibs(): 
    a,b = 1,2 
    while True: 
     yield b 
     a,b = a+2*b, 2*a+3*b 

tạo [2, 8, 34, 144, 610, 2584, 10.946 ...]

sau đó mã tiền của bạn trở thành:

total = 0 
for f in even_fibs(): 
    if f >= 4000000: 
     break 
    else: 
     total += f 

hoặc

from itertools import takewhile 
total = sum(takewhile(lambda n: n<4000000, even_fibs())) 
0

Chỉ cần kiểm tra điều này

A = [i for i in range(101)] 
B = [x for x in A if x%2 == 0] 
print B 
-1
a = range(0,1000) 
b = [] 
for c in a: 
    if c%2==0: 
     b.append(c) 
print b 
+0

Nó sẽ là tốt đẹp nếu bạn bao gồm một số thông tin liên quan đến những gì này. Ngoài ra, bạn có thể tiết kiệm rất nhiều mã bằng cách sử dụng đối số 'bước' thứ ba cho' dải ô'. – jonrsharpe

0

Bạn có thể làm điều này bằng cách sử dụng chức năng lọc như sau:

F = [1, 2] 
while F[-1] < 4000000: 
    F.append(F[-1] + F[-2]) 
print(F) 
print('\n') 
#create the variable that could store the sorted values from the list you have created. 
sorted_number=list(filter(lambda x:x%2==0,F)) 
print(sorted_number) 
Các vấn đề liên quan