簡體   English   中英

垂直或水平地在列表列表中“連續”計數值

[英]Counting values “in a row” in list of lists vertically or horizontally

我正在編寫一個函數,該函數計算水平或垂直行中列表列表的特定值的出現次數。 然后,它只需要返回發生多少次的值即可。 這是一個例子

lst=[['.','.','.','e'],
     ['A','A','.','e'],
     ['.','.','.','e'],
     ['.','X','X','X'],
     ['.','.','.','.'],
     ['.','.','.','e']]

對於此列表列表,該函數應該連續返回3次,使e返回3,對於A,返回2,對於X,返回3。感謝您的時間

到目前為止,我的代碼:

def length_of_row(symbol,lot):
    count = 0
    for sublist in lot:
        for x in sublist:
            if x == symbol:
                count += 1
                continue
            else:
                continue
                return count

用基本原理解決這實際上是一個很麻煩的問題,如果您剛剛開始學習編程,它將尤其困難。 這是一個簡潔但更高級的解決方案:

result = {}
for grid in [lst, zip(*lst)]:
    for row in grid:
        for key, group in itertools.groupby(row):
            result[key] = max(len(list(group)), result.get(key, 0))

那么result是:

{'A': 2, 'X': 3, 'e': 3, '.': 4}

如果您不介意進行一些更改,可以嘗試以下操作:

from functools import reduce
from itertools import takewhile


def length_of_row(symbol, lot):
    if symbol not in reduce(lambda x,y: x+y, lot):
        return 0
    elif symbol in lot[0]:
        good_lot =  map(lambda y: y.count(symbol),takewhile(lambda x: symbol in x, lot))
        return sum(good_lot)
    else:
        return length_of_row(symbol, lot[1:])

這結合了遞歸和python強大的itertools方法之一( takewhile )。 這個想法是計算符號的數量,直到您點擊不包含該符號的列表。 另外,它試圖確保僅在符號出現在列表列表中時才計算符號的出現次數。

使用它:

lst = [['.', '.', '.', 'e'],
 ['A', 'A', '.', 'e'],
 ['.', '.', '.', 'e'],
 ['.', 'X', 'X', 'X'],
 ['.', '.', '.', '.'],
 ['.', '.', '.', 'e']]

print(length_of_row('e', lst))
print(length_of_row('X', lst))
print(length_of_row('A', lst))
print(length_of_row('f', lst))

#3
#3
#2
#0

如您所見,如果該符號不存在,它將返回0

編輯:

如果您不想從itertools導入takewhile函數,則可以使用文檔中提供的近似定義。 但是請記住,它的優化程度不如itertools方法:

def takewhile(predicate, iterable):
    for x in iterable:
        if predicate(x):
            yield x
        else:
            break

另外,如果您正在使用python2 ,則reduce應該直接對您可用。 但是,您可以定義一個將列表列表簡化為一個列表的函數,如下所示:

def reduce_l_of_l(lst_of_lst):
    out_lst = []
    for lst in lst_of_lst:
        out_lst += lst
    return out_lst

無需使用reduce ,只需在定義后將其替換為reduce_l_of_l

我希望這有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM