Python tìm các phần tử liên tiếp trong danh sách

Hàm liệt kê lấy một đối tượng có thể lặp lại và trả về một đối tượng liệt kê chứa các bộ trong đó phần tử đầu tiên là chỉ mục và phần tử thứ hai - mục

Mục đầu tiên trong mỗi bộ là chỉ mục và mục thứ hai là mục danh sách tại chỉ mục đã cho

Chúng tôi đã sử dụng cách hiểu danh sách để lặp lại đối tượng liệt kê

Khả năng hiểu danh sách được sử dụng để thực hiện một số thao tác cho mọi phần tử hoặc chọn một tập hợp con các phần tử đáp ứng một điều kiện

Trên mỗi lần lặp, chúng tôi trừ mục hiện tại khỏi mục trước đó trong danh sách và trả về kết quả

Một điều quan trọng cần lưu ý là - chúng tôi đã sử dụng danh sách cắt lát [1:] để bỏ qua mục đầu tiên khỏi kết quả

Điều này là cần thiết vì chúng tôi không muốn trừ mục danh sách ở chỉ mục -1 khỏi mục danh sách ở chỉ mục 0

Cú pháp để cắt danh sách là my_list[start:stop:step] trong đó bao gồm giá trị start và giá trị stop là loại trừ

Nếu giá trị stop bị bỏ qua, lát sẽ đi đến cuối danh sách

Ngoài ra, bạn có thể kiểm tra xem giá trị của

def original[signal, unit_kernel]:
    return numpy.convolve[numpy.abs[numpy.diff[signal]], unit_kernel, mode='valid']


def alternative[signal, combined_kernel]:
    return numpy.convolve[signal, combined_kernel, mode='valid']
0 có lớn hơn 0 không

Nếu chỉ mục lớn hơn 0, chúng tôi biết rằng chúng tôi không ở trong lần lặp đầu tiên và có thể trừ mục 0 khỏi mục [1:]2 một cách an toàn, v.v.

Bạn chọn cách tiếp cận nào là vấn đề sở thích cá nhân. Tôi muốn cắt danh sách vì tôi thấy nó trực quan hơn là kiểm tra một điều kiện mà chúng tôi chỉ quan tâm trong lần lặp đầu tiên

Công cụ sau đây trực quan hóa những gì máy tính đang làm từng bước khi nó thực thi chương trình nói trên


Trình chỉnh sửa mã Python

Có một cách khác để giải quyết giải pháp này?

Trước. Viết chương trình Python để trích xuất số lượng phần tử được chỉ định từ một danh sách nhất định, nối tiếp nhau liên tục.
Tiếp theo. Viết chương trình Python để tính trung bình cộng của hai danh sách đã cho.

Mức độ khó của bài tập này là gì?

Dễ dàng trung bình khó

Kiểm tra kỹ năng Lập trình của bạn với bài kiểm tra của w3resource



con trăn. Lời khuyên trong ngày

In nâng cao

Bạn có muốn in nhiều giá trị bằng dấu tách do người dùng xác định không?

Công cụ sau đây trực quan hóa những gì máy tính đang làm từng bước khi nó thực thi chương trình nói trên


Trình chỉnh sửa mã Python

Có một cách khác để giải quyết giải pháp này?

Trước. Viết chương trình Python để chuyển đổi danh sách unicode đã cho thành danh sách chứa chuỗi.
Tiếp theo. Viết chương trình Python để kiểm tra xem một chuỗi đã cho có chứa phần tử hay không, phần tử này có trong danh sách

Mức độ khó của bài tập này là gì?

Dễ dàng trung bình khó

Kiểm tra kỹ năng Lập trình của bạn với bài kiểm tra của w3resource



con trăn. Lời khuyên trong ngày

In nâng cao

Bạn có muốn in nhiều giá trị bằng dấu tách do người dùng xác định không?

Cách tiếp cận tích chập được đề xuất trong câu trả lời của scleronomic rất hứa hẹn, đặc biệt nếu bạn đang tìm kiếm nhiều hơn hai yếu tố liên tiếp

Tuy nhiên, cách triển khai được trình bày trong câu trả lời đó có thể không hiệu quả nhất vì nó bao gồm hai bước.

def original[signal, unit_kernel]:
    return numpy.convolve[numpy.abs[numpy.diff[signal]], unit_kernel, mode='valid']


def alternative[signal, combined_kernel]:
    return numpy.convolve[signal, combined_kernel, mode='valid']
5 theo sau là
def original[signal, unit_kernel]:
    return numpy.convolve[numpy.abs[numpy.diff[signal]], unit_kernel, mode='valid']


def alternative[signal, combined_kernel]:
    return numpy.convolve[signal, combined_kernel, mode='valid']
6

thực hiện thay thế

Nếu chúng tôi cho rằng

def original[signal, unit_kernel]:
    return numpy.convolve[numpy.abs[numpy.diff[signal]], unit_kernel, mode='valid']


def alternative[signal, combined_kernel]:
    return numpy.convolve[signal, combined_kernel, mode='valid']
5 cũng có thể được tính bằng cách sử dụng tích chập, chúng tôi có thể kết hợp hai bước thành một tích chập duy nhất

Việc triển khai thay thế sau đây chỉ yêu cầu một tích chập duy nhất của tín hiệu đầy đủ, điều này thuận lợi nếu tín hiệu có nhiều phần tử

Lưu ý rằng chúng tôi không thể lấy các giá trị tuyệt đối của

def original[signal, unit_kernel]:
    return numpy.convolve[numpy.abs[numpy.diff[signal]], unit_kernel, mode='valid']


def alternative[signal, combined_kernel]:
    return numpy.convolve[signal, combined_kernel, mode='valid']
8 [để tránh xác thực sai, như đã đề cập trong nhận xét này], vì vậy chúng tôi thêm một số nhiễu ngẫu nhiên vào nhân đơn vị để thay thế

# example signal
signal = numpy.array[[1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0]]
# minimum number of consecutive elements
n_consecutive = 3
# convolution kernel for weighted moving sum [with small random component]
rng = numpy.random.default_rng[]
random_kernel = 1 + 0.01 * rng.random[n_consecutive - 1]
# convolution kernel for first-order difference [similar to numpy.diff]
diff_kernel = [1, -1]
# combine the kernels so we only need to do one convolution with the signal
combined_kernel = numpy.convolve[diff_kernel, random_kernel, mode='full']
# convolve the signal to get the moving weighted sum of differences
moving_sum_of_diffs = numpy.convolve[signal, combined_kernel, mode='valid']
# check if moving sum is zero anywhere
result = numpy.any[moving_sum_of_diffs == 0]

Xem hướng dẫn DSP để thảo luận chi tiết về tích chập

thời gian

Sự khác biệt giữa hai cách triển khai tập trung vào điều này

def original[signal, unit_kernel]:
    return numpy.convolve[numpy.abs[numpy.diff[signal]], unit_kernel, mode='valid']


def alternative[signal, combined_kernel]:
    return numpy.convolve[signal, combined_kernel, mode='valid']

trong đó

def original[signal, unit_kernel]:
    return numpy.convolve[numpy.abs[numpy.diff[signal]], unit_kernel, mode='valid']


def alternative[signal, combined_kernel]:
    return numpy.convolve[signal, combined_kernel, mode='valid']
9 và
def original[signal, unit_kernel]:
    return numpy.convolve[numpy.abs[numpy.diff[signal]], unit_kernel, mode='valid']


def alternative[signal, combined_kernel]:
    return numpy.convolve[signal, combined_kernel, mode='valid']
0 được xác định ở trên

So sánh hai chức năng này, sử dụng

def original[signal, unit_kernel]:
    return numpy.convolve[numpy.abs[numpy.diff[signal]], unit_kernel, mode='valid']


def alternative[signal, combined_kernel]:
    return numpy.convolve[signal, combined_kernel, mode='valid']
1, cho thấy rằng
def original[signal, unit_kernel]:
    return numpy.convolve[numpy.abs[numpy.diff[signal]], unit_kernel, mode='valid']


def alternative[signal, combined_kernel]:
    return numpy.convolve[signal, combined_kernel, mode='valid']
2 có thể nhanh hơn nhiều lần, đối với các kích thước hạt nhân nhỏ [i. e. giá trị nhỏ của
def original[signal, unit_kernel]:
    return numpy.convolve[numpy.abs[numpy.diff[signal]], unit_kernel, mode='valid']


def alternative[signal, combined_kernel]:
    return numpy.convolve[signal, combined_kernel, mode='valid']
0]. Tuy nhiên, đối với kích thước hạt nhân lớn, lợi thế trở nên không đáng kể, bởi vì tích chập trở nên chiếm ưu thế [so với
def original[signal, unit_kernel]:
    return numpy.convolve[numpy.abs[numpy.diff[signal]], unit_kernel, mode='valid']


def alternative[signal, combined_kernel]:
    return numpy.convolve[signal, combined_kernel, mode='valid']
8]

Chủ Đề