2010-01-20 42 views
39

Vì vậy, heres mã của tôi:yếu tố tìm không trong một danh sách

item = [0,1,2,3,4,5,6,7,8,9] 

for item in z: 
    if item not in z: 
     print item 

Z chứa một danh sách các số nguyên. Tôi muốn so sánh mục với Z và in ra các số không nằm trong Z khi so sánh với mục. Tôi có thể in các elemtens có trong Z khi so sánh không phải vật phẩm, nhưng khi tôi cố gắng và làm ngược lại bằng cách sử dụng mã trên không có gì in.

Bất kỳ trợ giúp nào?

Trả lời

90

Mã của bạn hiện không làm những gì tôi nghĩ bạn đang nghĩ. Dòng for item in z: sẽ lặp qua z, mỗi lần tạo item bằng một phần tử đơn lẻ là z. Do đó, danh sách item gốc được ghi đè trước khi bạn thực hiện bất kỳ điều gì với nó.

Tôi nghĩ rằng bạn muốn một cái gì đó như thế này:

item = [0,1,2,3,4,5,6,7,8,9] 

for element in item: 
    if element not in z: 
     print element 

Nhưng bạn có thể dễ dàng làm được điều này như:

set(item) - set(z) 
+58

Cách viết khác Pythonic bit đầu tiên sẽ là '[x cho x trong mục nếu x không trong z] ' –

+3

sử dụng' bộ' sẽ không hoạt động chính xác nếu danh sách được chọn chứa các phần tử không phải duy nhất, vì 'bộ' trước hết sẽ xóa tất cả trừ một lần xuất hiện của phần tử không phải duy nhất trong danh sách. – VDV

9
list1 = [1,2,3,4]; list2 = [0,3,3,6] 

print set(list2) - set(list1) 
+0

Điều này không có tác dụng .. Bạn cần làm 'danh sách in (set (list2) - set (list1))' – Whitecat

43
>> items = [1,2,3,4] 
>> Z = [3,4,5,6] 

>> print list(set(items)-set(Z)) 
[1, 2] 
2
>>> item = set([0,1,2,3,4,5,6,7,8,9]) 
>>> z = set([2,3,4]) 
>>> print item - z 
set([0, 1, 5, 6, 7, 8, 9]) 
3

Nếu bạn chạy một vòng lặp lấy các mục từ z, làm thế nào để bạn mong đợi họ không phải trong z? IMHO nó sẽ làm cho ý nghĩa hơn so sánh các mục từ một danh sách khác nhau để z.

2

Không, z là undefined. mục chứa danh sách các số nguyên.

Tôi nghĩ rằng những gì bạn đang cố gắng làm là thế này:

#z defined elsewhere 
item = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 

for i in item: 
    if i not in z: print i 

Như đã nêu trong câu trả lời khác, bạn có thể muốn thử sử dụng bộ.

2

Mã của bạn là một no-op. Theo định nghĩa của vòng lặp, "mục" phải nằm trong Z. Vòng lặp "For ... in" trong Python có nghĩa là "Vòng lặp mặc dù danh sách được gọi là 'z', mỗi lần bạn lặp lại, cho tôi mục tiếp theo trong danh sách, và gọi nó là 'mục'"

http://docs.python.org/tutorial/controlflow.html#for-statements

tôi nghĩ rằng sự nhầm lẫn của bạn bắt nguồn từ thực tế là bạn đang sử dụng tên biến 'mặt hàng' hai lần, có nghĩa là hai điều khác nhau.

0

Bạn chỉ định lại mục cho các giá trị bằng z khi bạn lặp qua z. Vì vậy, lần đầu tiên trong vòng lặp for của bạn, mục = 0, mục tiếp theo = 1, v.v ... Bạn sẽ không bao giờ kiểm tra một danh sách với danh sách kia.

Để làm điều đó rất rõ ràng:

>>> item = [0,1,2,3,4,5,6,7,8,9] 
>>> z = [0,1,2,3,4,5,6,7] 
>>> 
>>> for elem in item: 
... if elem not in z: 
...  print elem 
... 
8 
9 
9

Sử dụng danh sách hiểu:

print [x for x in item if x not in Z] 

hoặc sử dụng chức năng lọc:

filter(lambda x: x not in Z, item) 

Sử dụng set dưới mọi hình thức có thể tạo ra một lỗi nếu danh sách được kiểm tra có chứa các phần tử không phải là duy nhất, ví dụ:

print item 

Out[39]: [0, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9] 

print Z 

Out[40]: [3, 4, 5, 6] 

set(item) - set(Z) 

Out[41]: {0, 1, 2, 7, 8, 9} 

vs danh sách hiểu biết như trên

print [x for x in item if x not in Z] 

Out[38]: [0, 1, 1, 2, 7, 8, 9] 

hoặc chức năng lọc:

filter(lambda x: x not in Z, item) 

Out[38]: [0, 1, 1, 2, 7, 8, 9] 
0

Trong trường hợp itemz là lặp sắp xếp, chúng ta có thể giảm bớt sự phức tạp từ O(n^2) để O(n+m) bằng cách thực hiện điều này

def iexclude(sorted_iterator, exclude_sorted_iterator): 
    next_val = next(exclude_sorted_iterator) 
    for item in sorted_iterator: 
     try: 
      while next_val < item: 
       next_val = next(exclude_sorted_iterator) 
       continue 
      if item == next_val: 
       continue 
     except StopIteration: 
      pass 
     yield item 

Nếu cả hai là trình vòng lặp, chúng tôi cũng có cơ hội giảm dung lượng bộ nhớ không lưu trữ z (exclude_sorted_iterator) làm danh sách.

+0

cho vòng lặp (được chấp thuận trả lời) lớn Oh là 'O (n)' và câu trả lời của bạn có vòng lặp lồng nhau trong một thời gian cho vòng lặp vì vậy phức tạp sẽ tăng trong trường hợp của bạn là 'O (n^2)' –

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