2013-09-26 38 views
5

Tôi có 2 danh sách gồm một số, một được gọi là xVar và số còn lại được gọi là yVar. Tôi sẽ sử dụng 2 phần tử này để vẽ các giá trị X và Y trên biểu đồ. Cả hai đều có cùng một số yếu tố.python: Cách xóa giá trị khỏi 2 danh sách dựa trên những gì trong 1 danh sách

Thông thường, tôi sẽ chỉ vẽ

ax.scatter(xVar,yVar,s=2,color='tomato'); 

Tôi muốn xóa dữ liệu từ yVar rằng hơn một giá trị nhất định, ví dụ như tất cả dữ liệu có giá trị yVar qua 100, nhưng tôi cũng muốn loại bỏ được liên kết với giá trị xVar. Ai đó có thể đề xuất cách tạo 2 biến mới loại bỏ tất cả các giá trị trong yVar trên 100 và các giá trị xVar được liên kết với chúng không? Sau đó, tôi chỉ có thể thay thế xVar & yVar trong đường vẽ của mình thành các biến mới.

Cảm ơn một lần nữa All,

Trả lời

11

Bất cứ khi nào bạn muốn làm điều gì đó với các giá trị tương ứng của hai (hoặc nhiều hơn) danh sách, đó là những gì zip là dành cho. Nó cung cấp cho bạn một danh sách, các giá trị tương ứng cho mỗi chỉ mục.

Vì vậy, trong trường hợp này, zip hai danh sách với nhau, sau đó được lọc danh sách nén, sau đó giải nén chúng (với zip một lần nữa, như các tài liệu giải thích):

xVar, yVar = zip(*((x, y) for x, y in zip(xVar, yVar) if y <= 100)) 

Nếu đây là khó hiểu, hãy để tôi hiển thị nó từng bước:

>>> xVar = [1, 200, 300, 10] 
>>> yVar = [150, 100, 50, 200] 
>>> xyVar = zip(xVar, yVar) 
>>> xyVar 
[(1, 150), (200, 100), (300, 50), (10, 500)] 
>>> xyFiltered = [(x, y) for x, y in xyVar if y <= 100] 
>>> xyFiltered 
[(200, 100), (300, 50)] 
>>> xVar, yVar = zip(*xyFiltered) 
[(200, 300), (100, 50)] 
+0

+1 Tôi vừa mới viết cái này. – arshajii

+0

Tuyệt vời, cảm ơn bạn rất nhiều. – bigCow

1

Nếu không viết code, tìm ra chỉ số cho y bạn muốn xóa, lưu chỉ mục, loại bỏ các giá trị y, sau đó loại bỏ các giá trị x ở số điện thoại chỉ số tương tự.

+1

Nhưng có thể là thủ đoạn/Gremlins khi loại bỏ nhiều yếu tố (ví dụ như khi loại bỏ là trong lần lặp của danh sách) theo cách này .. – user2246674

+0

@ user2246674: Chỉ cần một lừa, thực sự: Bạn phải đảo ngược các chỉ số trước loại bỏ chúng. Nhưng yeah, nó thực sự dễ dàng để quên làm điều đó, hoặc làm cho nó sai. – abarnert

0

Tìm chỉ số tương ứng với dữ liệu bạn muốn giữ lại:

ind = [i for i in range(len(yVar)) if yVar[i] < 100] 

Và chỉ sử dụng những điểm:

yVar = [yVar[i] for i in ind] 
xVar = [xVar[i] for i in ind] 
+2

bạn có thể muốn kiểm tra [liệt kê] (http://docs.python.org/2/library/functions.html#enumerate) – iruvar

+0

@ 1_CR Cảm ơn, vâng, đó là một lựa chọn tốt. – sashkello

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