我正在编写一个函数,用于计算列表列表连续中特定值的出现次数,无论是水平还是垂直。然后它只需要返回它发生的次数的值。这是一个例子
lst=[['.','.','.','e'],
['A','A','.','e'],
['.','.','.','e'],
['.','X','X','X'],
['.','.','.','.'],
['.','.','.','e']]
对于此列表列表,该函数应为 e 返回 3,因为它连续出现 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
最佳答案
如果您不介意稍微改变一下,可以尝试以下操作:
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
即可。
我希望这会有所帮助。
关于python - 垂直或水平计数列表列表中的值 "in a row",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40351370/