2013-02-28 54 views
14

Tôi đã hai danh sách nóiLàm cách nào để kiểm tra xem tất cả các mục trong danh sách có trong danh sách khác không?

List1 = ['a','c','c'] 
List2 = ['x','b','a','x','c','y','c'] 

Bây giờ tôi muốn tìm hiểu xem tất cả các yếu tố của List1 đang có trong List2. Trong trường hợp này tất cả đều có. Tôi không thể sử dụng chức năng tập hợp con vì tôi có thể có các phần tử lặp lại trong danh sách. Tôi có thể sử dụng vòng lặp for để đếm số lần xuất hiện của từng mục trong List1 và xem nó có nhỏ hơn hoặc bằng số lần xuất hiện trong List2 hay không. Có cách nào tốt hơn để làm điều này?

Cảm ơn.

Trả lời

25

Bạn vẫn có thể sử dụng chức năng tập hợp con, bằng cách tạo ra một tập hợp một cách nhanh chóng:

>>> list1 = ['a', 'c', 'c'] 
>>> list2 = ['x', 'b', 'a', 'x', 'c', 'y', 'c'] 
>>> set(list1) < set(list2) 
True 

Hoặc nếu bạn muốn kiểm tra xem số lần xuất hiện phù hợp, bạn có thể tận dụng các loại Counter và xác định mối quan hệ tập hợp con của riêng bạn:

>>> from collections import Counter 
>>> def counterSubset(list1, list2): 
     c1, c2 = Counter(list1), Counter(list2) 
     for k, n in c1.items(): 
      if n > c2[k]: 
       return False 
     return True 

>>> counterSubset(list1, list2) 
True 
>>> counterSubset(list1 + ['a'], list2) 
False 
>>> counterSubset(list1 + ['z'], list2) 
False 

Nếu bạn đã có quầy (mà có thể là một lựa chọn hữu ích để lưu trữ dữ liệu của bạn anyway), bạn cũng có thể chỉ cần viết này như một dòng duy nhất:

>>> all(n <= c2[k] for k, n in c1.items()) 
True 
+0

Xin chào, phần thứ hai là những gì tôi đang cố gắng làm. Có vẻ như đó là cách duy nhất để đi. Cảm ơn! – pogo

+0

Không thành công trong trường hợp '['s', 'e', ​​'r', '', '', '', 'y']' và '['', '', '', 'y' ] ' – SIslam

+0

@SIslam Phụ thuộc vào thứ tự. Danh sách thứ hai là một tập hợp con của danh sách cũ, vì vậy giải pháp trong câu trả lời của tôi sẽ nhận ra chính xác nó. – poke

0

này sẽ trở thành sự thật là tất cả các mục trong List1 đang trong List2

def list1InList2(list1, list2): 
    for item in list1: 
     if item not in list2: 
      return False 
    return True 
+1

Tôi không phải là downvoter, nhưng bạn thực sự nên xem [PEP 8] (http://www.python.org/dev/peps/pep-0008/). Cú pháp 'if' của bạn bị tắt, bạn có một dấu chấm phẩy không cần thiết, và kiểu đặt tên biến của bạn nên được dành riêng cho các lớp. –

+1

Ngoài ra, điều này có thể được giảm xuống thành một dòng: 'tất cả (mục trong List2 cho mục trong List1)'. –

+0

Tôi đã sử dụng List1 và List2 dưới dạng tên biến vì đó là những gì có trong câu hỏi, và đã lâu rồi tôi mới sử dụng python nên tôi sẽ thừa nhận dấu chấm phẩy và dấu ngoặc đơn xung quanh nếu là số – jeffam217

1
def check_subset(list1, list2): 
    try: 
     [list2.remove(x) for x in list1] 
     return 'all elements in list1 are in list2' 
    except: 
     return 'some elements in list1 are not in list2' 
2

Hãy nhận biết những điều sau đây:

>>>listA = ['a', 'a', 'b','b','b','c'] 
>>>listB = ['b', 'a','a','b','c','d'] 
>>>all(item in listB for item in listA) 
True 

Nếu bạn đọc "tất cả" dòng như bạn sẽ bằng tiếng Anh, Điều này không sai nhưng có thể gây hiểu lầm, vì listA có thứ ba 'b' nhưng listB thì không.

này cũng có cùng một vấn đề:

def list1InList2(list1, list2): 
    for item in list1: 
     if item not in list2: 
      return False 
    return True 

Chỉ cần một lưu ý. Các tính năng sau không hoạt động:

>>>tupA = (1,2,3,4,5,6,7,8,9) 
>>>tupB = (1,2,3,4,5,6,6,7,8,9) 
>>>set(tupA) < set(TupB) 
False 

Nếu bạn chuyển đổi bộ danh sách thành danh sách vẫn không hoạt động. Tôi không biết tại sao dây làm việc nhưng ints thì không.

trình nhưng có cùng một vấn đề không giữ đếm lần xuất hiện yếu tố:

>>>set(tupA).issubset(set(tupB)) 
True 

Sử dụng bộ không phải là một giải pháp toàn diện cho phù hợp với yếu tố đa xảy ra xuất.

Nhưng đây là một giải pháp một lót/thích ứng với câu trả lời shantanoo mà không thử/trừ:

all(True if sequenceA.count(item) <= sequenceB.count(item) else False for item in sequenceA) 

Một chức năng được xây dựng trong gói một danh sách hiểu cách sử dụng một nhà điều hành có điều kiện ternary. Python là tuyệt vời! Lưu ý rằng "< =" không được "==".

Với chuỗi giải pháp A và B này có thể gõ tuple và danh sách và các "chuỗi" khác bằng phương pháp "đếm". Các phần tử trong cả hai trình tự có thể là hầu hết các loại. Tôi sẽ không sử dụng điều này với dicts như bây giờ, do đó sử dụng "chuỗi" thay vì "lặp lại".

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