python - 垂直或水平计数列表列表中的值 "in a row"

标签 python list python-3.x count symbols

我正在编写一个函数,用于计算列表列表连续中特定值的出现次数,无论是水平还是垂直。然后它只需要返回它发生的次数的值。这是一个例子

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/

相关文章:

Python 日期时间格式化 - 将字符串格式化为指定格式

python - TypeError : __init__() got an unexpected keyword argument 'checksec'

python - 将具有多列的计算结果添加到具有 MultiIndex 列的 Pandas DataFrame

list - 从mathematica列表中选择项目

python - 尝试将二进制转换为十进制: ended with a weird int error?

python-3.x - 如何解析所有现有数据计数变量

python - 选择每组的最大行 - Pandas 性能问题

JAVA双向链表-统计相等的数据项

pythonic将变量转换为列表的方法

python - 我的 Django if 语句无法正常工作