2012-07-16 23 views
5

Tôi có giải pháp cho câu hỏi sau. workaround Đó sẽ là một vòng lặp for với một thử nghiệm để đưa vào sản xuất như sau:Tại sao danh sách hiểu không lọc ra các bản sao?

#!/usr/bin/env python 

def rem_dup(dup_list): 
    reduced_list = [] 
    for val in dup_list: 
     if val in reduced_list: 
      continue 
     else: 
      reduced_list.append(val) 

    return reduced_list 

Tôi hỏi những câu dưới đây, bởi vì tôi tò mò muốn xem nếu có một giải pháp danh sách hiểu.

Với các dữ liệu sau:

reduced_vals = [] 
vals = [1, 2, 3, 3, 2, 2, 4, 5, 5, 0, 0] 

Tại sao

reduced_vals = = [x for x in vals if x not in reduced_vals] 

sản xuất cùng một danh sách?

>>> reduced_vals 
[1, 2, 3, 3, 2, 2, 4, 5, 5, 0, 0] 

Tôi nghĩ rằng nó có cái gì để làm với việc kiểm tra đầu ra (reduced_vals) như một phần của một bài tập vào một danh sách. Tôi tò mò, mặc dù là vì lý do chính xác.

Cảm ơn bạn.

+0

Bạn có thể nhận được rất gần bằng câu trả lời [this] (http://stackoverflow.com/a/6197827/355230). – martineau

Trả lời

6

Việc hiểu danh sách sẽ tạo danh sách mới, trong khi reduced_vals trỏ đến danh sách trống trong suốt quá trình đánh giá danh sách hiểu.

Ngữ nghĩa của các bài tập trong Python là: Đánh giá phía bên phải và liên kết đối tượng kết quả với tên ở phía bên tay trái. Việc gán cho một tên trống không bao giờ làm thay đổi bất kỳ đối tượng nào.

Nhân tiện, bạn nên sử dụng set() hoặc collections.OrderedDict.fromkeys() để loại bỏ các bản sao một cách hiệu quả (tùy thuộc vào việc bạn có cần giữ gìn trật tự hay không).

+0

Tôi sẽ bao gồm các bộ sưu tập như thế nào? Tôi chỉ cố gắng; nó được nhập khẩu; nhưng tôi đã gặp lỗi >>> collections.OrderedDict.fromkeys (màu) Traceback (cuộc gọi gần đây nhất): Tệp "", dòng 1, trong NameError: tên 'bộ sưu tập' không được xác định tôi đang sử dụng Python 2.7.x – octopusgrabbus

+1

@octopusgrabbus: 'nhập khẩu collections' bộ sưu tập –

+0

>>> import >>> collections.OrderedDict.fromkeys (màu) Traceback (gần đây nhất gọi cuối cùng): file "", dòng 1, trong AttributeError: đối tượng 'module' không có thuộc tính 'OrderedDict' – octopusgrabbus

1

Bởi vì các phần tử trong danh sách hiểu không được gán cho reduced_vals cho đến khi toàn bộ danh sách được xây dựng. Sử dụng vòng lặp for với .append() nếu bạn muốn thực hiện công việc này.

+0

Đó là những gì đang xảy ra trong mã gốc (mã không có OP 'giải pháp') – Dhara

4

Bạn đang thử nghiệm đối với danh sách trống.

Biểu thức được đánh giá đầy đủ trước khi gán nó làm giá trị mới reduced_vals, do đó vẫn trống cho đến khi biểu thức danh sách đầy đủ được đánh giá.

Để đặt nó khác, biểu thức [x for x in vals if x not in reduced_vals] được thực hiện riêng biệt. Nó có thể giúp đỡ nếu bạn xem mã của bạn trong một thời trang chút thay đổi:

temp_var = [x for x in vals if x not in reduced_vals] 
reduced_vals = temp_var 
del temp_var 

Trên đây là tương đương với đạo đức của trực tiếp giao kết quả của biểu thức danh sách để reduced_vals, nhưng tôi đã tách ra rõ ràng hơn gán kết quả bằng cách sử dụng biến thứ hai.

4

Trong dòng này: [x for x in vals if x not in reduced_vals] có không phải là một giá trị duy nhất đó là không trong reduced_vals, như reduced_vals là danh sách rỗng []. Nói cách khác, không có gì được lọc và tất cả các yếu tố trong số vals được trả lại.

Nếu bạn cố gắng này:

[x for x in vals if x in reduced_vals] 

Kết quả là danh sách trống [], như tất cả các giá trịkhông trong reduced_vals (đó là trống). Tôi tin rằng bạn có một sự nhầm lẫn với cách phần lọc hoạt động trong một danh sách hiểu: bạn thấy, bộ lọc chỉ chọn những giá trị mà làm cho điều kiện True, nhưng nó sẽ không ngăn chặn các giá trị trùng lặp.

Bây giờ, nếu những gì bạn cần là lọc ra các bản sao, thì việc hiểu danh sách không phải là công cụ thích hợp cho công việc. Cho rằng, sử dụng một bộ - mặc dù nó sẽ không nhất thiết phải giữ gìn trật tự của danh sách ban đầu, nó sẽ đảm bảo rằng các yếu tố là duy nhất:

vals = [1, 2, 3, 3, 2, 2, 4, 5, 5, 0, 0] 
list(set(vals)) 
> [0, 1, 2, 3, 4, 5] 
0

reduced_vals không được thay đổi trong đánh giá hiểu danh sách.

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