Как я могу прекратить повторять код, когда я делаю для циклов для подсчета различных критериев?

Я думаю, вы заблудились в своем 2-мерном списке, который не нужен. Вы можете просто использовать оператор in, который указывает, что строка может быть найдена в другой. Тогда единственная проблема состоит в том, чтобы создать все подстроки одного из ваших входов.

def sliding_window(seq, width):
    """yields all substrings of `seq` of length `width`"""
    return (seq[idx:idx+width] for idx in range(len(seq)-width+1))

def lcw(seq1, seq2):
    """length of the longest common sequence shared by seq1 and seq2"""
    max_width = min(len(seq1), len(seq2))
    for width in range(max_width, 0, -1):
        if any(sub in seq1 for sub in sliding_window(seq2, width)):
            return width
    return 0

lcw('zxab', 'yzab')
>>>
2

Но это очень хорошо, может быть, я не получил ваше подвое слово определения, которое я действительно не мог отличить от подпоследовательности.

0
задан Joe Donaghue 18 January 2019 в 22:25
поделиться

1 ответ

Где я вижу повторение - это структура цикла. Я бы использовал такой код с однострочными условными выражениями, если не важно, какое условие увеличивает переменную счетчика. Вы можете добавить столько условий, сколько хотите, и код остается относительно плоским. Между прочим, хорошо использовать «явную опцию». В первой строке Workbook есть опечатка "Workbok"

Option Explicit

Sub test()
Dim workbook1 As Workbook
Set workbook1 = ThisWorkbook
Dim i As Long, count As Long
For i = 1 To Worksheets.count
    If IsEmpty(workbook1.Worksheets("Sheet" & i).Cells(1, 1)) Then count = count + 1
    If Application.CountA(workbook1.Worksheets("Sheet" & i).Range("$C$3:$E$5")) > 0 Then count = count + 1
Next i
End Sub

РЕДАКТИРОВАТЬ:
Вместо того, чтобы использовать разные переменные подсчета, как вы прокомментировали, я бы предпочел иметь все условия счетчики в одном месте. Это можно сделать с помощью массива или словаря.

Использование массива:

Option Explicit

Sub UseOfArray()
Dim workbook1 As Workbook
Set workbook1 = ThisWorkbook
Dim i As Long
Dim conditions_in_array(1 To 20) As Long

For i = 1 To Worksheets.count
    If IsEmpty(workbook1.Worksheets("Sheet" & i).Cells(1, 1)) Then conditions_in_array(1) = conditions_in_array(1) + 1
    If workbook1.Worksheets("Sheet" & i).Cells(1, 1).Interior.Color = 16777215 Then conditions_in_array(2) = conditions_in_array(2) + 1
Next i
Debug.Print "conditions_in_array(1): "; conditions_in_array(1); vbNewLine; "conditions_in_array(2): "; conditions_in_array(2)

End Sub

Использование словаря (я бы предпочел этот подход, так как с большим количеством условий его легче отлаживать):

Sub UseOfDictionary()
Dim i As Long
Dim workbook1 As Workbook
Set workbook1 = ThisWorkbook
Dim conditions_in_dict As Scripting.Dictionary
Set conditions_in_dict = New Scripting.Dictionary
conditions_in_dict("cell_IsEmpty") = 0
conditions_in_dict("cell_uncolored") = 0
'here you can enter more keys as conditions as above

For i = 1 To Worksheets.count
    If IsEmpty(workbook1.Worksheets("Sheet" & i).Cells(1, 1)) Then conditions_in_dict("cell_IsEmpty") = conditions_in_dict("cell_IsEmpty") + 1
    If workbook1.Worksheets("Sheet" & i).Cells(1, 1).Interior.Color = 16777215 Then conditions_in_dict("cell_uncolored") = conditions_in_dict("cell_uncolored") + 1
Next i
Debug.Print "conditions_in_dict(""cell_IsEmpty""): "; conditions_in_dict("cell_IsEmpty"); vbNewLine; _
"conditions_in_dict(""cell_uncolored""): "; conditions_in_dict("cell_uncolored")

End Sub
0
ответ дан cekar 18 January 2019 в 22:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: