[英]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.