Python: Tìm trong danh sách

651
Stephane Rolland 2012-03-03 16:03.

Tôi đã bắt gặp điều này:

item = someSortOfSelection()
if item in myList:
    doMySpecialFunction(item)

nhưng đôi khi nó không hoạt động với tất cả các mục của tôi, như thể chúng không được nhận dạng trong danh sách (khi đó là một danh sách chuỗi).

Đây có phải là cách 'khó hiểu' nhất để tìm một mục trong danh sách if x in l:không:?

10 answers

1282
Niklas B. 2012-03-03 16:10.

Đối với câu hỏi đầu tiên của bạn: mã đó hoàn toàn ổn và sẽ hoạt động nếu itembằng một trong các phần tử bên trong myList. Có thể bạn cố gắng tìm một chuỗi không khớp chính xác với một trong các mục hoặc có thể bạn đang sử dụng giá trị float bị thiếu chính xác.

Đối với câu hỏi thứ hai của bạn: Thực sự có một số cách khả thi nếu "tìm thấy" những thứ trong danh sách.

Kiểm tra xem có thứ gì bên trong không

Đây là trường hợp sử dụng mà bạn mô tả: Kiểm tra xem có thứ gì đó nằm trong danh sách hay không. Như bạn đã biết, bạn có thể sử dụng intoán tử cho điều đó:

3 in [1, 2, 3] # => True

Lọc một bộ sưu tập

Đó là, tìm tất cả các phần tử trong một dãy đáp ứng một điều kiện nhất định. Bạn có thể sử dụng khả năng hiểu danh sách hoặc biểu thức trình tạo cho điều đó:

matches = [x for x in lst if fulfills_some_condition(x)]
matches = (x for x in lst if x > 6)

Sau đó sẽ trả về một trình tạo mà bạn có thể tưởng tượng như một loại danh sách lười biếng sẽ chỉ được tạo ngay sau khi bạn lặp qua nó. Nhân tiện, cái đầu tiên chính xác tương đương với

matches = filter(fulfills_some_condition, lst)

trong Python 2. Tại đây bạn có thể thấy các hàm bậc cao đang hoạt động. Trong Python 3, filterkhông trả về một danh sách mà là một đối tượng giống như trình tạo.

Tìm lần xuất hiện đầu tiên

Nếu bạn chỉ muốn điều đầu tiên phù hợp với một điều kiện (nhưng bạn chưa biết nó là gì), bạn có thể sử dụng vòng lặp for (có thể sử dụng cả elsemệnh đề không thực sự nổi tiếng). Bạn cũng có thể dùng

next(x for x in lst if ...)

sẽ trả về kết quả phù hợp đầu tiên hoặc nâng lên StopIterationnếu không tìm thấy kết quả nào. Ngoài ra, bạn có thể sử dụng

next((x for x in lst if ...), [default value])

Tìm vị trí của một mặt hàng

Đối với danh sách, cũng có indexphương pháp đôi khi có thể hữu ích nếu bạn muốn biết vị trí của một phần tử nhất định trong danh sách:

[1,2,3].index(2) # => 1
[1,2,3].index(4) # => ValueError

Tuy nhiên, lưu ý rằng nếu bạn có các bản sao, hãy .indexluôn trả về chỉ số thấp nhất: ......

[1,2,3,2].index(2) # => 1

Nếu có bản sao và bạn muốn có tất cả các chỉ mục thì bạn có thể sử dụng enumerate()thay thế:

[i for i,x in enumerate([1,2,3,2]) if x==2] # => [1, 3]
204
Janusz Skonieczny 2012-04-25 07:22.

Nếu bạn muốn tìm một phần tử hoặc Nonesử dụng phần tử mặc định next, phần tử đó sẽ không tăng lên StopIterationnếu mục không được tìm thấy trong danh sách:

first_or_default = next((x for x in lst if ...), None)
24
Vincent Cantin 2015-12-04 20:53.

Mặc dù câu trả lời từ Niklas B. khá toàn diện, nhưng khi chúng ta muốn tìm một mục trong danh sách, đôi khi rất hữu ích để lấy chỉ mục của nó:

next((i for i, x in enumerate(lst) if [condition on x]), [default value])
14
Antony Hatchkins 2018-01-08 09:07.

Tìm lần xuất hiện đầu tiên

Có một công thức cho điều đó trong itertools:

def first_true(iterable, default=False, pred=None):
    """Returns the first true value in the iterable.

    If no true value is found, returns *default*

    If *pred* is not None, returns the first item
    for which pred(item) is true.

    """
    # first_true([a,b,c], x) --> a or b or c or x
    # first_true([a,b], x, f) --> a if f(a) else b if f(b) else x
    return next(filter(pred, iterable), default)

Ví dụ: đoạn mã sau tìm số lẻ đầu tiên trong danh sách:

>>> first_true([2,3,4,5], None, lambda x: x%2==1)
3  
7
Engineero 2018-09-05 05:25.

Một thay thế khác: bạn có thể kiểm tra xem một mục có trong danh sách với if item in list:, nhưng đây là thứ tự O (n). Nếu bạn đang xử lý danh sách các mục lớn và tất cả những gì bạn cần biết là liệu thứ gì đó có phải là thành viên trong danh sách của bạn hay không, trước tiên bạn có thể chuyển đổi danh sách thành một nhóm và tận dụng tra cứu nhóm thời gian liên tục :

my_set = set(my_list)
if item in my_set:  # much faster on average than using a list
    # do something

Sẽ không phải là giải pháp chính xác trong mọi trường hợp, nhưng đối với một số trường hợp, điều này có thể mang lại cho bạn hiệu suất tốt hơn.

Lưu ý rằng việc tạo tập hợp với set(my_list)cũng là O (n), vì vậy nếu bạn chỉ cần làm điều này một lần thì không nhanh hơn để làm theo cách này. Tuy nhiên, nếu bạn cần liên tục kiểm tra tư cách thành viên, thì đây sẽ là O (1) cho mọi lần tra cứu sau khi tạo nhóm ban đầu.

5
josef 2019-01-20 03:12.

Định nghĩa và Cách sử dụng

các count()phương thức trả về số phần tử với giá trị quy định.

Cú pháp

list.count(value)

thí dụ:

fruits = ['apple', 'banana', 'cherry']

x = fruits.count("cherry")

Ví dụ của câu hỏi:

item = someSortOfSelection()

if myList.count(item) >= 1 :

    doMySpecialFunction(item)
4
Alexey Antonenko 2018-01-23 22:49.

Bạn có thể muốn sử dụng một trong hai tìm kiếm khả thi khi làm việc với danh sách các chuỗi:

  1. nếu phần tử danh sách bằng một mục ('ví dụ' nằm trong ['một', 'ví dụ', 'hai']):

    if item in your_list: some_function_on_true()

    'ex' in ['one', 'ex', 'two'] => Đúng

    'ex_1' trong ['one', 'ex', 'two'] => Sai

  2. nếu phần tử danh sách giống như một mục ('ví dụ' nằm trong ['một,' ví dụ ',' hai '] hoặc "ví dụ_1" nằm trong [' một ',' ví dụ ',' hai ']):

    matches = [el for el in your_list if item in el]

    hoặc là

    matches = [el for el in your_list if el in item]

    sau đó chỉ cần kiểm tra len(matches)hoặc đọc chúng nếu cần.

1
Taylor 2019-01-03 03:34.

Thay vì sử dụng list.index(x)nó trả về chỉ số của x nếu nó được tìm thấy trong danh sách hoặc trả về một #ValueErrorthông báo nếu không tìm thấy x, bạn có thể sử dụng list.count(x)nó trả về số lần xuất hiện của x trong danh sách (xác thực rằng x thực sự có trong danh sách) hoặc nó trả về 0 nếu không (nếu không có x). Điều thú vị count()là nó không phá vỡ mã của bạn hoặc yêu cầu bạn ném một ngoại lệ khi không tìm thấy x

1
Vlad Bezden 2020-04-04 07:24.

Nếu bạn định kiểm tra xem giá trị có tồn tại trong bộ sưu tập một lần hay không thì việc sử dụng toán tử 'in' là tốt. Tuy nhiên, nếu bạn định kiểm tra nhiều lần thì tôi khuyên bạn nên sử dụng mô-đun bisect. Hãy nhớ rằng sử dụng dữ liệu mô-đun bisect phải được sắp xếp. Vì vậy, bạn sắp xếp dữ liệu một lần và sau đó bạn có thể sử dụng bisect. Sử dụng mô-đun bisect trên máy của tôi nhanh hơn khoảng 12 lần so với sử dụng toán tử 'in'.

Đây là một ví dụ về mã sử dụng cú pháp Python 3.8 trở lên:

import bisect
from timeit import timeit

def bisect_search(container, value):
    return (
      (index := bisect.bisect_left(container, value)) < len(container) 
      and container[index] == value
    )

data = list(range(1000))
# value to search
true_value = 666
false_value = 66666

# times to test
ttt = 1000

print(f"{bisect_search(data, true_value)=} {bisect_search(data, false_value)=}")

t1 = timeit(lambda: true_value in data, number=ttt)
t2 = timeit(lambda: bisect_search(data, true_value), number=ttt)

print("Performance:", f"{t1=:.4f}, {t2=:.4f}, diffs {t1/t2=:.2f}")

Đầu ra:

bisect_search(data, true_value)=True bisect_search(data, false_value)=False
Performance: t1=0.0220, t2=0.0019, diffs t1/t2=11.71
0
Stephane Rolland 2015-07-05 22:02.

Kiểm tra xem không có khoảng trắng bổ sung / không mong muốn nào trong các mục của danh sách chuỗi. Đó là một lý do có thể can thiệp vào việc giải thích các mục không thể tìm thấy.

Related questions

MORE COOL STUFF

Cate Blanchett chia tay chồng sau 3 ngày bên nhau và vẫn kết hôn với anh ấy 25 năm sau

Cate Blanchett chia tay chồng sau 3 ngày bên nhau và vẫn kết hôn với anh ấy 25 năm sau

Cate Blanchett đã bất chấp những lời khuyên hẹn hò điển hình khi cô gặp chồng mình.

Tại sao Michael Sheen là một diễn viên phi lợi nhuận

Tại sao Michael Sheen là một diễn viên phi lợi nhuận

Michael Sheen là một diễn viên phi lợi nhuận nhưng chính xác thì điều đó có nghĩa là gì?

Hallmark Star Colin Egglesfield Các món ăn gây xúc động mạnh đối với người hâm mộ tại RomaDrama Live! [Loại trừ]

Hallmark Star Colin Egglesfield Các món ăn gây xúc động mạnh đối với người hâm mộ tại RomaDrama Live! [Loại trừ]

Ngôi sao của Hallmark Colin Egglesfield chia sẻ về những cuộc gặp gỡ với người hâm mộ ly kỳ tại RomaDrama Live! cộng với chương trình INSPIRE của anh ấy tại đại hội.

Tại sao bạn không thể phát trực tuyến 'chương trình truyền hình phía Bắc'

Tại sao bạn không thể phát trực tuyến 'chương trình truyền hình phía Bắc'

Bạn sẽ phải phủi sạch đầu đĩa Blu-ray hoặc DVD để xem tại sao Northern Exposure trở thành một trong những chương trình nổi tiếng nhất của thập niên 90.

Where in the World Are You? Take our GeoGuesser Quiz

Where in the World Are You? Take our GeoGuesser Quiz

The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!

8 công dụng tuyệt vời của Baking Soda và Giấm

8 công dụng tuyệt vời của Baking Soda và Giấm

Bạn biết đấy, hai sản phẩm này là nguồn điện để làm sạch, riêng chúng. Nhưng cùng với nhau, chúng có một loạt công dụng hoàn toàn khác.

Hạn hán, biến đổi khí hậu đe dọa tương lai của thủy điện Hoa Kỳ

Hạn hán, biến đổi khí hậu đe dọa tương lai của thủy điện Hoa Kỳ

Thủy điện rất cần thiết cho lưới điện của Hoa Kỳ, nhưng nó chỉ tạo ra năng lượng khi có nước di chuyển. Bao nhiêu nhà máy thủy điện có thể gặp nguy hiểm khi các hồ và sông cạn kiệt?

Quyên góp tóc của bạn để giúp giữ nước sạch của chúng tôi

Quyên góp tóc của bạn để giúp giữ nước sạch của chúng tôi

Tóc tỉa từ các tiệm và các khoản quyên góp cá nhân có thể được tái sử dụng như những tấm thảm thấm dầu và giúp bảo vệ môi trường.

BoJack Horseman vẫn gan ruột và gan dạ hơn bao giờ hết trong phần 3

BoJack Horseman vẫn gan ruột và gan dạ hơn bao giờ hết trong phần 3

BoJack Horseman (Ảnh: Netflix) BoJack Horseman bắt đầu mùa thứ ba với sự xuất hiện của nhân vật tiêu biểu, người vẫn đang theo đuổi những lời khen ngợi từ giới phê bình trong một nỗ lực tuyệt vọng để tìm ra ý nghĩa trong cuộc sống của mình. Mùa thứ hai về số phận bi kịch của Raphael Bob-Waksberg dày đặc những trò đùa cũng như tuyệt vọng.

Xem cách tính năng lái tự động cập nhật của Tesla bùng phát như thế nào khi bạn bỏ qua các cảnh báo của nó

Xem cách tính năng lái tự động cập nhật của Tesla bùng phát như thế nào khi bạn bỏ qua các cảnh báo của nó

Bản nâng cấp Phiên bản 8.0 gần đây của Tesla đối với hệ thống Lái xe tự động được thiết kế để cải thiện hệ thống và mối quan hệ của nó với người lái.

UnREAL, Chương trình Truyền hình Về Truyền hình Thực tế Chúng tôi Không biết Chúng tôi Cần

UnREAL, Chương trình Truyền hình Về Truyền hình Thực tế Chúng tôi Không biết Chúng tôi Cần

Chắc chắn khi con cái chúng ta xem lại các chương trình chúng ta đã xem vào khoảng năm 2015, chúng sẽ thấy UnREAL, một chương trình truyền hình mới chiếu vào tối Thứ Hai của Lifetime — bạn sẽ thấy đúng lúc, sẽ phát sóng ngay sau khi The Bachelor kết thúc — như một chương trình không thể được thực hiện vào bất kỳ thời điểm nào khác trong lịch sử truyền hình, nhưng một chương trình cảm thấy cần thiết để xem bây giờ. UnREAL có sự tham gia của Shiri Appleby trong vai Rachel, một nhà sản xuất truyền hình cho một chương trình về cơ bản là The Bachelor, mặc dù trong thế giới này, nó được gọi là Vĩnh viễn.

Sau tất cả, Josh Trank sẽ không đạo diễn bộ phim tuyển tập Star Wars thứ hai

Sau tất cả, Josh Trank sẽ không đạo diễn bộ phim tuyển tập Star Wars thứ hai

Thông báo chính thức đến trực tiếp từ trang web của Star Wars: Fantastic Four, đạo diễn Josh Trank, một người bí ẩn không xuất hiện tại đại hội Star Wars Celebration gần đây, sẽ không chỉ đạo phần hai Star Wars Anthology. Đây là tuyên bố được đăng ngày hôm qua: Tất cả thực sự là ngôn ngữ rất lịch sự, nhưng một bài báo của Hollywood Reporter cho thấy tất cả đều không tốt ở hậu trường, gọi sự ra đi là "một vụ sa thải" một phần dựa trên "hành vi bất thường" của Trank trong khi quay Fantastic Four: The Bài báo trích dẫn các nguồn gọi là Trank “đôi khi thiếu quyết đoán và thiếu sáng tạo,” và lưu ý rằng Fantastic Four, khởi chiếu vào ngày 7 tháng 8, đã được khởi động lại vào cuối tháng 4.

Edwin McCain ra mắt Grand Ole Opry: Quay cảnh hậu trường với nhạc sĩ 'I'll Be'

Edwin McCain ra mắt Grand Ole Opry: Quay cảnh hậu trường với nhạc sĩ 'I'll Be'

McCain, người đang làm việc cho một album mới, lần đầu tiên bước vào vòng kết nối vào tối thứ Sáu ở Nashville

Nicky Hilton Forced to Borrow Paris' 'I Love Paris' Sweatshirt After 'Airline Loses All [My] Luggage'

Nicky Hilton Forced to Borrow Paris' 'I Love Paris' Sweatshirt After 'Airline Loses All [My] Luggage'

Nicky Hilton Rothschild's luggage got lost, but luckily she has an incredible closet to shop: Sister Paris Hilton's!

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa. Từ Hollywood đến New York và mọi nơi ở giữa, hãy xem các ngôi sao yêu thích của bạn đang làm gì!

17 tuổi bị đâm chết trong khi 4 người khác bị thương trong một cuộc tấn công bằng dao trên sông Wisconsin

17 tuổi bị đâm chết trong khi 4 người khác bị thương trong một cuộc tấn công bằng dao trên sông Wisconsin

Các nhà điều tra đang xem xét liệu nhóm và nghi phạm có biết nhau trước vụ tấn công hay không

Tôi viết như thế nào

Tôi viết như thế nào

Đối với tôi, mọi thứ là về dòng đầu tiên đó và nó sẽ đưa bạn đến đâu. Một số nhà văn bị điều khiển bởi cốt truyện, sự sắp xếp tinh tế của các quân cờ, trong khi những người khác bị lôi cuốn bởi một nhân vật và khả năng thực hiện một cuộc hành trình với một người bạn hư cấu mới.

Đường băng hạ cánh

Đường băng hạ cánh

Cuối hè đầu thu là mùa hoài niệm. Những chiếc đèn đường chiếu ánh sáng của chúng qua những con đường đẫm mưa, và những chiếc lá dưới chân - màu đỏ cam tắt trong bóng chạng vạng - là lời nhắc nhở về những ngày đã qua.

Hãy tưởng tượng tạo ra một chiến lược nội dung thực sự CHUYỂN ĐỔI. Nó có thể.

Hãy tưởng tượng tạo ra một chiến lược nội dung thực sự CHUYỂN ĐỔI. Nó có thể.

Vào năm 2021, tôi khuyến khích bạn suy nghĩ lại mọi thứ bạn biết về khách hàng mà bạn phục vụ và những câu chuyện bạn kể cho họ. Lùi lại.

Sự mất mát của voi ma mút đã mở ra trái tim tôi để yêu

Sự mất mát của voi ma mút đã mở ra trái tim tôi để yêu

Vào ngày sinh nhật thứ 9 của Felix The Cat, tôi nhớ về một trong những mất mát lớn nhất trong cuộc đời trưởng thành của tôi - Sophie của tôi vào năm 2013. Tôi đã viết bài luận này và chia sẻ nó trên nền tảng này một thời gian ngắn vào năm 2013.

Language